我以前有一个PHP数组,其中包含一个国家列表:
$countries = array(
'AX' => 'Åland Islands',
'AF' => 'Afghanistan',
'GB' => 'United Kingdom'
);
$collator = collator_create('en');
collator_asort($collator, $countries, Collator::SORT_STRING);显然,对于这个例子,这个列表要短得多,但是这里的排序是有效的。我预料到了然后得到了:
然而,我需要添加更多的数据,并且它变成了多维的:
$countries = array(
array(
'name' => 'Åland Islands',
'code' => 'AX'
),
array(
'name' => 'Afghanistan',
'code' => 'AF'
),
array(
'name' => 'United Kingdom',
'code' => 'GB'
)
);
usort($countries, function($a, $b){ return $a['name'] <=> $b['name']; });它对名单上的其他国家进行了排序,但给了我这样的答案:
我一生都想不出该如何正确地解决这个问题。我意识到没有在它的当前状态中调用或应用校勘器,但是是否有一种方法可以使校勘器在多维环境中工作呢?
发布于 2016-07-03 16:07:12
下面是基于您的初步方法的可能解决方案:
usort($countries, function($a, $b) {
$collator = collator_create('en');
$arr = array($a['name'], $b['name']);
collator_asort($collator, $arr, Collator::SORT_STRING);
return array_pop($arr) == $a['name'];
});但是,为了在长列表上获得最佳性能,您可能只想在匿名函数的作用域之外实例化$collator一次。
发布于 2019-10-23 07:35:11
对于多维数组,我们可以使用collator_compare()函数定义自定义排序函数:
$collator = new Collator('en');
usort($countries, function($a, $b) use ($collator) {
return $collator->compare($a['name'], $b['name']);
});发布于 2016-07-03 16:03:39
要对没有Collator的“国家列表”进行排序,您应该使用iconv函数将所有带有重音字符的单词转换为它的ASCII表示(例如Å到A):
usort($countries, function($a, $b){
return strcasecmp(iconv('utf-8', 'ascii//TRANSLIT', $a['name']), iconv('utf-8', 'ascii//TRANSLIT', $b['name']));
});
print_r($countries);产出:
Array
(
[0] => Array
(
[name] => Afghanistan
[code] => AF
)
[1] => Array
(
[name] => Åland Islands
[code] => AX
)
[2] => Array
(
[name] => United Kingdom
[code] => GB
)
)https://stackoverflow.com/questions/38171550
复制相似问题