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()です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()は 2 つの項目を比較するためにコールバック関数を呼び出します。最初の項目が 2 番目の項目の前にある、同じである、または後にあることを示すために、コールバックは <0、0、または >0 の値を返す必要があります。

strcmp()はすでに 2 つの文字列を比較し、次のような値を返します。そのため、実際の比較は に任せて、比較するstrcmp()正しいusort()文字列を選択するロジックだけをコールバック関数に処理させ、firstname の値が等しい場合は lastname にフォールバックすることができます。 .

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 に答える