2

私はphp関数usortがどのように機能するかを理解しようとしています。私はそのようなコードを持っています:

<?php 
$users[] = array('login' => 'moon', 'name' => 'Chris');
$users[] = array('login' => 'star', 'name' => 'Piter');
$users[] = array('login' => 'mars', 'name' => 'Tim');
$users[] = array('login' => 'earth', 'name' => 'Garry');

function compare($a, $b) {                  
    echo $a['login'] . '--' . $b['login'] . '<br />';
    echo strcmp($a['login'], $b['login']) . '<br />';
    return strcmp($a['login'], $b['login']);              
}
usort($users, "compare");

echo '<pre>'; print_r($users); echo '</pre>';
?>

次のような結果が出力されます。

star--moon
1
star--mars
1
earth--star
-1
moon--earth
1
mars--moon
-1
earth--mars
-1
Array
(
    [0] => Array
        (
            [login] => earth
            [name] => Garry
        )

    [1] => Array
        (
            [login] => mars
            [name] => Tim
        )

    [2] => Array
        (
            [login] => moon
            [name] => Chris
        )

    [3] => Array
        (
            [login] => star
            [name] => Piter
        )

)

私が理解している限り、2番目のパラメーターは比較関数である必要があり、3つの値(-1,0,1)しか返すことができず、usortこの結果を使用して配列を並べ替えることができますか?また、usortQuicksort実装を使用して配列をソートすることも読みました。それが、星が最初でが2番目である理由です。クイックソートは配列を2つの部分に分割し、それをソートしますか?そして、この関数を2,3次元配列に実装できますか?

4

2 に答える 2

2

はい、usortは比較関数を使用して値を比較し、クイックソートアルゴリズムで配列を並べ替えます。http://php.net/manual/en/function.usort.phpから:

比較関数は、最初の引数がそれぞれ2番目の引数よりも小さい、等しい、または大きいと見なされる場合、ゼロより小さい、等しい、またはより大きい整数を返す必要があります。

PHPでのusortの実装へのリンクはここにあります:PHPはどのソートアルゴリズムを使用しますか?http://murilo.wordpress.com/2011/02/05/phps-sort-functions-are-bad-designed/によると、アルゴリズムはピボット要素として中央の要素を使用し、次のように実装されます。

offset = (end - begin) >> 1;

これが、アルゴリズムが最初のピボット要素として「スター」を使用する理由です。

多次元配列の場合、インデックスの関連付けを維持する場合はuasortを使用します。この質問には、多次元配列の並べ替えの例が含まれています。

于 2012-06-30T10:45:10.927 に答える
1

配列内の任意の 2 つの項目を比較usortするときに、どの項目を最初に配置するかを示しています。関数は要素strcmpの値の比較を返してloginいるため、ログイン名に基づいてすべての要素をアルファベット順に並べています。

于 2012-06-29T19:47:27.207 に答える