我有一个数组,需要按名字的字母顺序排序。
如何用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
)
这怎么能按照名字和姓氏的字母顺序排列呢?
对这些结果进行排序的最简单方法是将其作为查询的一部分:
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()
回调函数只处理选择正确的字符串进行比较的逻辑,并在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);