[PHP-users 15471]Re: ユーザー定義の比較関数により値で配列をソートする方法(usort)について

Seto seto @ cii.gr.jp
2003年 5月 25日 (日) 14:52:14 JST


 Setoです。
引用前後してます。

>おはようございます。吉田です。

>としてみた所、挙動不審な動きを見せます。このような配列をソートするには
>このユーザー定義関数におかしな点があるのでしょうか。
>
>http://ns1.php.gr.jp/pipermail/php-users/2002-October/010579.html
>を拝見しましたが、今一つ理解出来ません。
ご自分で提示されたURLをごらんになったなら
「挙動不審な動き」ではなく
「どのような結果となり」「どう納得がいかないのか(期待する動作)」を
かかれたほうが良いと思います。
# 先のURLの中でもMashikiさんがそのようにかかれてますよね :)

手元の環境で試してみましたが
最初に配列定義した順番が usortした結果の順番に反映されないということ
つまり
>Array (
>    [0] => 5    http://www.yahoo.co.jp/?6732    yahoo
>    [1] => 5    http://google.co.jp    google
>    [2] => 1    http://www.example.net    example - Home
>    [3] => 64    http://www.hoge.to    hoge
>)
の[0]と[1]が usort した結果では 逆転しているということを
挙動不審といわれているのでしょうか。

としたらマニュアルにあるように
   2つのメンバーの比較結果が等しいとなった場合、
   ソートされた配列の順番は定義されません。 
ということですので 正しい動作と言うことになりますね。

元配列データをもっとたくさんにして
使用関数の頭で 引数を 出力して見ましたが
複雑な順番で処理をしているようです。
ぱっと見た限りではどのような規則性なのか私には理解できませんでした。
ですから 必ず逆転するという規則ではないようです。
# ソースもみてません。


で これを何とかしたいのでしたなら最初のデータを
Array (
    [0] => 5    0    http://www.yahoo.co.jp/?6732    yahoo
    [1] => 5    1    http://google.co.jp    google
    [2] => 1    2    http://www.example.net    example - Home
    [3] => 64   3    http://www.hoge.to    hoge
)
のように最初の配列の添え字をデータに追加してranksortの中で
チェックすればできると思います。

私のテストした環境は
Windows2000
Apache1.3.27 + PHP4.3.1

******************************
 Junya Seto
******************************



PHP-users メーリングリストの案内