2013-07-19 58 views
2

我有一個數組,我需要按照字母順序排序,按名字排序。用數據庫輸入命名數組

我如何命名每個數組元素與firstname,所以我可以使用排序功能。

功能...

<?php 
// fetches all for the users from the table 
function fetch_users_directory(){ 
$result = mysql_query('SELECT `user_lastname` AS `lastname`, 
           `user_firstname` AS `firstname`, 
           `user_id` AS `id` FROM `users`'); 
$users = array(); 
while(($row = mysql_fetch_assoc($result)) !== false){ 
    $test = mysql_query('SELECT `user_firstname` FROM `users`'); 
    $users[] = $row; 
} 
return $users; 
print_r($user); 
?> 

結果是...

Array 
(
[3] => Array 
    (
     [lastname] => Stoss 
     [firstname] => Alex 
     [id] => 1 
    ) 

[4] => Array 
    (
     [lastname] => Kennedy 
     [firstname] => Alice 
     [id] => 2 
    ) 

[5] => Array 
    (
     [lastname] => Williams 
     [firstname] => Anna 
     [id] => 3 
    ) 

[6] => Array 
    (
     [lastname] => De Jong 
     [firstname] => Anna 
     [id] => 4 
    ) 

[7] => Array 
    (
     [lastname] => Goodwin 
     [firstname] => Ash 
     [id] => 5 
    ) 

這可怎麼通過姓名字母順序排列,然後名字?

+0

歡迎StackOverflow上。 ** [請不要將mysql_ *函數用於新代碼。](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php)**不再維護並正式棄用。請參閱** [紅盒子](http://php.net/manual/en/function.mysql-connect.php)**?您可以使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/mysqli) - [本頁](http://php.net/manual/en /mysqlinfo.api.choosing.php)可以幫助你決定使用哪一個。 – jcsanyi

+0

爲什麼不使用'ORDER_BY firstname,lastname'在查詢中排序呢? –

+0

爲什麼額外的(未使用的)查詢'$ test = mysql_query(...'在你的循環內? – jcsanyi

回答

2

對這些結果進行排序,最簡單的方法是做它作爲查詢的一部分:

SELECT `user_lastname` AS `lastname`, 
     `user_firstname` AS `firstname`, 
     `user_id` AS `id` 
FROM `users` 
ORDER BY `firstname` ASC, `lastname` ASC 

如果你想在PHP雖然排序,最好的辦法是使用usort()strcmp()

usort($users, function($a, $b) { 
    if ($a['firstname'] != $b['firstname']) { 
     return strcmp($a['firstname'], $b['firstname']); 
    } else { 
     return strcmp($a['lastname'], $b['lastname']); 
    } 
}); 

usort()將調用回調函數,以比較兩個項目 - 與您的回調需要返回的值0,0或> 0表示第一個項目在之前,與第二個項目相同,或者在第二個項目之後。

strcmp()已經比較兩個字符串並返回這樣的值 - 因此,我們可以把實際的比較strcmp(),並有usort()回調函數只是處理選擇合適的字符串進行比較,並回落至姓氏中的邏輯名字值相等的事件。

這可能有助於理解這個更加認識到字符串數組上運行的標準的PHP sort()功能幾乎是一樣的運行usort($array, 'strcmp');


一種替代解決方案,你似乎在暗示在你的問題將是使用您想要排序的字符串作爲$users陣列的關鍵,然後使用ksort()排序它。

在這種情況下,你的排序上的字符串將是「姓」,所以你可以將它放入你的循環是這樣的:

while(($row = mysql_fetch_assoc($result)) !== false){ 
    $users[$row['firstname'] . ' ' . $row['lastname']] = $row; 
} 
ksort($users); 
+0

謝謝你的工作很棒!使用了sql函數 – charlie

+0

好吧,它會排序第一個名字好,但爲什麼是忽略最後的名字?ORDER BY' firstname' ASC,'lastname' ASC? – charlie

+0

只要名字不同,它將完全按名字排序,而忽略姓氏。它將使用姓氏對具有相同名字的兩個值進行排序。以你爲例,這只是安娜威廉姆斯和安娜德容 - 誰將首先與安德容排序。 – jcsanyi