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
    )

如何按名字按字母顺序排列,然后按姓氏?

4

1 回答 1

2

对这些结果进行排序的最简单方法是将其作为查询的一部分进行:

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

但是,如果您想在 PHP 中对其进行排序,最好的方法是使用usort()with 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()回调函数只处理选择要比较的正确字符串的逻辑,并在名字值相等时回退到姓氏.

sort()意识到在字符串数组上运行标准 PHP 函数与运行几乎相同,这可能有助于进一步理解这一点usort($array, 'strcmp');


您似乎在问题中暗示的另一种解决方案是使用要排序的字符串作为$users数组的键,然后使用ksort()它对其进行排序。

在这种情况下,您要排序的字符串将是“firstname lastname”,因此您可以将其放入循环中,如下所示:

while(($row = mysql_fetch_assoc($result)) !== false){
    $users[$row['firstname'] . ' ' . $row['lastname']] = $row;
}
ksort($users);
于 2013-07-19T05:14:42.883 回答