在 php 中对名称数组进行排序

问题描述 投票:0回答:4

我有一系列人名:

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
)
php arrays sorting
4个回答
5
投票
function cmp($a, $b)
{
    $a1 = explode(' ', $a);
    $b1 = explode(' ', $b);
    return strcasecmp(end($a1), end($b1));
}

usort($arr, 'cmp');

3
投票

看看 uksort 以及那里给出的示例,这与您的问题非常相似。

您可能想将其中的正则表达式替换为

preg_replace("/[A-Z]\\. /", '', $a);

1
投票

您可以使用装饰-排序-取消装饰模式进行排序,键是数组的最后一个元素,这是用空格分割字符串的结果

$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);                                                                                                                                              

0
投票

因为在

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()
被调用以将键与其新位置中的原始值重新关联。

© www.soinside.com 2019 - 2024. All rights reserved.