如何根据姓氏对名称数组进行排序,并保留关键字


How to sort an array of names by surname preserving the keys

我有一个数组,如下所示:

Array(
    [27] => 'Sarah Green',
    [29] => 'Adam Brown',
    [68] => 'Fred Able'
);

我想按姓氏排序并保留密钥:

Array(
    [68] => 'Fred Able'
    [29] => 'Adam Brown',
    [27] => 'Sarah Green'
);

有些名字可能有两个以上的名字,但它总是我想排序的最后一个名字

在PHP中,最好的方法是什么?

您可以使用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);
?>

这是一个演示。

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;
}

也许不是最快的方法,但它有效。如果他们也有中间名,那就行了。

这比公认的答案要快。

http://codepad.org/ogGibRpH

我认为你不能用PHP内置的数组排序直接做到这一点——尽管如果有人纠正我的错误,我会很感兴趣。

最简单的方法是颠倒名称,使其变为绿色,Sarah,因为这样你就可以使用PHPs自己的排序函数,例如使用asort()(它维护密钥关联)。

如果这不可行,您可能需要实现自己的自定义排序功能。最简单的方法是使用usort(),它允许您定义一个自定义比较器函数。例如:

usort($arr, "sortByLastName");
function sortByLastName($a, $b) {
     //DO YOUR COMPARISON IN HERE
}

可能与类似(尚未测试)

function sortSurname($a,$b){
  $sur_a = array_pop(explode(' ',$a));
  $sur_b = array_pop(explode(' ',$b));
  return $sur_a < $sur_b;
}
usort($array, 'sortSurname')

我不确定是否有一种直接的方法可以按姓氏对示例数组进行排序。

您可以用不同的方式将名称添加到数组中。即"Fred Able"将变为"Able,Fred"。这将允许您使用PHP的内置数组排序函数。

如果做不到这一点,您可能必须遍历每个数组元素并用空格进行分解,使用返回数组的最后一段作为姓氏。有点混乱,但我相信有很多例子和函数。

您可能需要创建一个带有姓氏的辅助数组,保留密钥,对其进行排序,然后重建原始数组:

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)时,姓氏并不总是全名的最后一个单词。

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