我有一系列人名:
Array
(
[1] => A. Aitken
[2] => A. C. Skinner
[3] => A. Chen
[4] => R. Baxter
)
在 php 中按姓氏(字母顺序)顺序对数组进行排序的最快方法是什么?即给予
Array
(
[1] => A. Aitken
[4] => R. Baxter
[3] => A. Chen
[2] => A. C. Skinner
)
function cmp($a, $b)
{
$a1 = explode(' ', $a);
$b1 = explode(' ', $b);
return strcasecmp(end($a1), end($b1));
}
usort($arr, 'cmp');
您可以使用装饰-排序-取消装饰模式进行排序,键是数组的最后一个元素,这是用空格分割字符串的结果
$arr = array(
'A. Aitken',
'A. C. Skinner',
'A. Chen',
'R. Baxter'
);
// actual sorting below
$arr= array_map(create_function('$a', 'return array(array_slice(explode(" ", $a), -1), $a);'), $arr); // transform into array of arrays consisted of sort key and item
sort($arr); // sort array of arrays
$arr = array_map('end', $arr); // take only last element from each array
print_r($arr);
因为在
uasort()
的每次迭代中调用两个或多个函数的性能不高,并且因为 array_multisort()
不会保留数字键,所以我设计了一个脚本来最小化迭代函数调用并在使用 array_multisort()
时单独保留键。
代码:(演示)
$firsts = [];
$lasts = [];
$keys = [];
foreach ($array as $keys[] => $v) {
[$firsts[], $lasts[]] = preg_split('/.*\K |^/', $v);
}
array_multisort($lasts, $firsts, $keys, $array);
var_export(array_combine($keys, $array));
上面的脚本填充名字、姓氏和原始键的单独(大小相同)的数组。
正则表达式在最后出现的空格上分割,或者如果不存在,则在第一个字符之前的位置分割(意味着第一个名称值将为空)。
array_multisort()
将按姓氏 ASC 排序,然后是名字 ASC,然后是键 ASC(但此时不会有任何关系可以打破),然后是全名值 ASC(但同样,不会有任何关系可以打破) ).
array_combine()
被调用以将键与其新位置中的原始值重新关联。