我在 PHP 中将重音值作为数组的键。我想按键排序,但似乎 Collator 对象没有此选项,而是销毁键。
<?php
$arr = ['Brasil' => 3, 'África do Sul' => 5];
$collator = new Collator('pt_BR');
$collator->sort($arr);
var_dump($arr);
$arr = ['Brasil' => 3, 'África do Sul' => 5];
$collator->asort($arr);
var_dump($arr);
$arr = ['Brasil' => 3, 'África do Sul' => 5];
$collator->sortWithSortKeys($arr);
var_dump($arr);
?>
这将显示:
array(2) {
[0]=>int(3)
[1]=>int(5)
}
array(2) {
["Brasil"]=>int(3)
["África do Sul"]=>int(5)
}
array(2) {
[0]=>int(3)
[1]=>int(5)
}
如何实现下面我想要的排序?
array(2) {
["África do Sul"]=>int(5)
["Brasil"]=>int(3)
}
新建议:
使用
uksort()
并传递 Collator
类的 compare
方法作为回调。
代码:(演示)
uksort(
$arr,
[new Collator('pt_BR'), 'compare']
);
var_export($arr);
旧建议:
我以前从未使用过这个类,但我相信这是一个简单的误解PHP手册的问题。老实说,我也被方法名称欺骗了。它不按键排序——正如您在手册的演示中看到的那样,值正在排序。
因为您的键(根据定义)是唯一的,所以您可以安全地调用
array_keys()
来创建一个临时索引数组,其中原始键现在是值。然后将原始数据映射到排序后的数组中。
代码:(演示)
$arr = [
'Alemanha' => 1,
'China' => 5,
'EUA' => 13,
'Itália' => 2,
'África do Sul' => 1
];
$collator = new Collator('pt_BR');
$keys = array_keys($arr);
$collator->sort($keys);
foreach ($keys as $key) {
$result[$key] = $arr[$key];
}
var_export($result);
或者(演示)
$collator = new Collator('pt_BR');
$keys = array_keys($arr);
$collator->sort($keys);
var_export(
array_replace(
array_flip($keys),
$arr
)
);
输出:
array (
'África do Sul' => 1,
'Alemanha' => 1,
'China' => 5,
'EUA' => 13,
'Itália' => 2,
)