2012-02-21 116 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; 

}

此外,請注意,你可能有問題這是因爲當你有兩個姓氏(例如約翰·克拉克·摩爾)時,姓並不總是全名的最後一個字。