我有一个数组如下:
Array(
[27] => 'Sarah Green',
[29] => 'Adam Brown',
[68] => 'Fred Able'
);
我想按姓氏排序并保留密钥:
Array(
[68] => 'Fred Able'
[29] => 'Adam Brown',
[27] => 'Sarah Green'
);
有些名字可能有两个以上的名字,但它总是我想要排序的最后一个名字。
在PHP中执行此操作的最佳方法是什么?
答案 0 :(得分:9)
您可以使用uasort
功能,该功能允许您指定自定义排序方法,同时还保留键:
<?php
// A function to sort by last name.
function lastNameSort($a, $b) {
$aLast = end(explode(' ', $a));
$bLast = end(explode(' ', $b));
return strcasecmp($aLast, $bLast);
}
// The array of data.
$array = array(
27 => 'Sarah Green',
29 => 'Adam Brown',
68 => 'Fred Able'
);
// Perform the sort:
uasort($array, 'lastNameSort');
// Print the result:
print_r($array);
?>
答案 1 :(得分:1)
function sortByLastName($a){
$tmp = $a;
foreach($tmp as $k => $v){
$tmp[$k] = substr($v,strrpos($v, ' ')+1);
}
asort($tmp);
$ret = array();
foreach($tmp as $k => $v){
$ret[$k] = $a[$k];
}
return $ret;
}
也许不是最快的方式,但它有效。如果他们也有中间名,那就有用。
这比接受的答案要快。
答案 2 :(得分:0)
我不认为你可以用PHP的内置数组排序直接做到这一点 - 尽管如果有人纠正我的话,我会感兴趣。
最简单的方法是反转名称,使其变为绿色,Sarah,因为那时你可以使用PHP自己的排序功能,例如使用asort()(维护密钥关联)。
如果这不可行,您可能需要实现自己的自定义排序功能。最简单的方法是使用usort(),它允许您定义自定义比较器函数。例如:
usort($arr, "sortByLastName");
function sortByLastName($a, $b) {
//DO YOUR COMPARISON IN HERE
}
答案 3 :(得分:0)
可能与此相似(未经测试)
function sortSurname($a,$b){
$sur_a = array_pop(explode(' ',$a));
$sur_b = array_pop(explode(' ',$b));
return $sur_a < $sur_b;
}
usort($array, 'sortSurname')
答案 4 :(得分:0)
我不确定是否有一种按姓氏直接排序示例数组的方法。
您可以以不同的方式向阵列添加名称。即“Fred Able”将成为“Able,Fred”。这将允许您使用PHP的内置数组排序函数。
如果失败了,你可能不得不遍历每个数组元素并按空格分解,使用返回数组的最后一部分作为你的姓氏。有点乱,但我确信那里有很多例子和功能。
答案 5 :(得分:0)
您可能想要创建一个带有姓氏的辅助数组,保留密钥,对其进行排序,然后重建原始数组:
function order_by_surname($names) {
foreach ($names as $key => $name) {
$surnames[$key] = array_pop(explode(' ', $name));
}
asort($surnames);
foreach ($surnames as $key => $surname) {
$ordered[$key] = $names[$key];
}
return $ordered;
}
另外,请注意您可能遇到此问题,因为当您有两个姓氏时,姓氏并不总是姓氏的最后一个字(例如John Clark Moore)。
答案 6 :(得分:0)
<?php
$names= Array('Fred Able','Adam Brown','Sarah Green');
$new_arr=array();
$clength = count($names);
for($x = 0; $x < $clength; $x++) {
$y= array_reverse(explode(' ',$names[$x]));
$y=implode(" ",$y);
array_push($new_arr,$y);
}
rsort($new_arr); // for rsort sorting with descending order, for ASC use sort
print_r($new_arr);
?>