此问题在此处已有答案:
Trying to sort a multidimensional array, by a sub-value with special characters(3个答案)
2天前关闭。
我有一个数组,需要按顺序排序,忽略重音(例如,“e”应该在“é"之前,“a”应该在其变体之后,例如“à")。数组从JSON文件中读取,解码,组织(或者应该是),然后编码回来(供员工添加对象)。我唯一的问题是每个有重音的字母都放在末尾。下面是我的代码示例:
$myArray = [
{"myKey":"Aaa","values":[1,1,1,1,1,1,1]},
{"myKey":"Test01","values":[1,1,1,1,1,1,1]},
{"myKey":"Test02","values":[1,1,1,1,1,1,1]},
{"myKey":"BBB","values":[1,1,1,1,1,1,1]},
{"myKey":"Écha","values":[1,1,1,1,1,1,1]}
]
setlocale(LC_COLLATE, 'fr_CA.utf8');
usort($myArray, function($a, $b){
return strcoll($a["myKey"], $b["myKey"]);
});
$myNewFile = json_encode($myArray,JSON_NUMERIC_CHECK|JSON_UNESCAPED_UNICODE);
echo $myNewFile;
字符串
回声给出:
[
{"myKey":"Aaa","values":[1,1,1,1,1,1,1]},
{"myKey":"BBB","values":[1,1,1,1,1,1,1]},
{"myKey":"Test01","values":[1,1,1,1,1,1,1]},
{"myKey":"Test02","values":[1,1,1,1,1,1,1]},
{"myKey":"Écha","values":[1,1,1,1,1,1,1]}
]
型
当它应该是:
[
{"myKey":"Aaa","values":[1,1,1,1,1,1,1]},
{"myKey":"BBB","values":[1,1,1,1,1,1,1]},
{"myKey":"Écha","values":[1,1,1,1,1,1,1]},
{"myKey":"Test01","values":[1,1,1,1,1,1,1]},
{"myKey":"Test02","values":[1,1,1,1,1,1,1]}
]
型
我还尝试了以下方法,因为我尽我所能找到一个现有的解决方案与多个职位在这个问题上:
$collator = new Collator('fr_CA.utf8');
$collator->sort($myArray);
型
和(没有必要,因为我在PHP 7+,但我绝望)
usort($myArray["Ingrédients"], 'custom_sort');
function custom_sort(($a, $b){
return strcoll($a["Ingrédients"], $b["Ingrédients"]);
});
型
(因为我是PHP 7+)
usort($myArray, function($a, $b) {
return $a['myKey'] <=> $b['myKey'];
});
型
我还为setlocale使用了不同的国家代码,例如
'fr_CA.utf8', 'fr_FR.utf8', 'fr_CA', 'fr_FR'
型
这些方法中的每一个似乎都适用于我到目前为止看到的所有帖子中的每个人,但它们都很过时。除了对重音排序之外,它们都可以工作,所以我得到的结果是一样的,不管方法是什么。服务器是PHP 7.1.1,如果这有帮助的话。
1条答案
按热度按时间kxkpmulp1#
好的,简而言之,你遇到的问题是由于字符的值。
strcoll
根据字符的值来比较字符串。我假设你使用的是utf-8或非常类似的东西。关于值,请参见UTF-8,注意带重音符号的e的值比Z高得多?这就是为什么你会遇到这个问题。为了解决这个问题,你必须为重音字符添加特殊情况,因为正常的排序不起作用。所以,基本上,创建你自己的比较函数,它会在f通常的地方加上重音符号,等等。