2012-02-21 111 views
4

我有一个数组如下:如何排序按姓氏名称的数组保存键

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

我想按姓氏排序,并保留键:

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

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

在PHP中这样做的最好方法是什么?

回答

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

明智而快速的回应。但是,与实际结果没有任何关系,'end'将它作为参考。这将导致“严格标准”错误。要解决这个问题,只需将'explode(',$ a)'和'explode('',$ b)'分配给变量。对不起,只是挑剔。 – 2012-02-21 00:58:37

+0

@ bob-the-destroyer:啊,好吧。感谢您指出了这一点!并挑剔是好:) – Ryan 2012-02-21 01:00:27

+0

作品一个治疗的感谢,并且比我想法快得多的想法更加优雅!感谢@ bob-the-destroyer提示。 – 2012-02-21 01:04:06

0

我不认为你可以直接使用PHP的内置数组排序 - 尽管如果有人纠正我这个问题,我会感兴趣。

最简单的方法是颠倒名称,使它变成绿色,莎拉,因为那样你就可以使用PHP自己的排序功能,例如,使用asort()(它维护密钥关联)。

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

usort($arr, "sortByLastName"); 

function sortByLastName($a, $b) { 
    //DO YOUR COMPARISON IN HERE 
} 
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') 
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

0

我不知道是否有姓氏的排序您的示例阵列的一个直接的方式。

您可以以不同的方式向数组添加名称。即“Fred Able”将变成“Able,Fred”。这将允许您使用PHP的内置数组排序功能。

如果失败了,您可能需要遍历每个数组元素并使用空格分解,并将最后一个返回数组作为姓。有点混乱,但我确信有大量的例子和功能在那里。

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; 

}

此外,请注意,你可能有问题这是因为当你有两个姓氏(例如约翰·克拉克·摩尔)时,姓并不总是全名的最后一个字。