如何按保留键的姓氏对名称数组进行排序

时间:2012-02-21 00:46:13

标签: php arrays sorting

我有一个数组如下:

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

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

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

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

在PHP中执行此操作的最佳方法是什么?

7 个答案:

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

Here's a demo.

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

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

这比接受的答案要快。

http://codepad.org/ogGibRpH

答案 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);

?>