使用数据库输入命名数组

时间:2013-07-19 05:07:05

标签: php mysql sorting

我有一个数组,我需要按名字字母顺序排序。

如何用firstname命名每个数组元素,以便我可以使用sort函数。

...功能

<?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按字母顺序排序?

1 个答案:

答案 0 :(得分: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()将调用回调函数以比较两个项目 - 并且您的回调需要返回值&lt; 0,0或&gt; 0以指示之前的第一个项目,是相同的as,或在第二项之后。

strcmp()已经比较了两个字符串并返回这样的值 - 所以我们可以将实际比较保留为strcmp(),并让usort()回调函数只处理选择的逻辑要比较的正确字符串,并在firstname值相等的情况下回退到lastname。

理解在字符串数组上运行标准PHP sort()函数与运行usort($array, 'strcmp');

几乎相同可能有助于理解这一点。

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

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

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