2013-07-19 1 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 
    ) 

, как это может быть заказан в алфавитном порядке Firstname затем LastName?

+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() обратного вызова просто обрабатывать логику выбора правильных строк для сравнения, и откатиться к LastName в значение первого значения равно.

Это может помочь понять это даже больше, чтобы понять, что для запуска стандартной функции 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

ok, поэтому он будет сортировать первое имя в порядке, но почему это игнорирует имена? ORDER BY ' firstname' ASC, 'lastname' ASC? – charlie

+0

Пока имена не совпадают, они будут сортироваться полностью по имени и игнорировать фамилию. Он просто использует имя для сортировки двух значений, имеющих одно и то же имя. В вашем примере это только Анна Уильямс и Анна Де Йонг, которые сначала будут отсортированы с Энн Де Йонг. – jcsanyi