質問: array(8,2,3,6,7,9,1,5,4); usort($a,'func'); foreach($a as $v){ echo$v } ``` マニュアルには以下とありますが、最初の引数と二番目の引数というのは何を比較しているのでしょうか。 ``` 最初の引数と二番目の引数の比較結果を返します。 最初の引数のほうが二番目の引数より大きい場合は正の数を、 二番目の引数と等しい場合はゼロを、 そして二番目の引数より小さい場合は負の数を返す必要があります。 ``` 実際のusortの挙動は以下の認識ですが、結果が「5123456789」となりません。 何が違うのでしょうか。 1まず最初に第一引数は8、第二引数は2となる 2$x-$yの正の数が返ってくるので、第二引数が大きいとみなされる (もうこの時点8 < 2という判定なので誤りですよね?) 3usortは昇順のため「82」と設定される。 4次の第一引数は??、第二引数は3 ・・・の流れではないのでしょうか・・・?
回答: PHPのソート関数は内部でクイックソートが使われているため、先頭から順番に2個が引数になるわけではありません。クイックソートのアルゴリズムについては検索してください。 マニュアルの説明文は、最初の引き数は $x, 二番目の引数は $y という認識で合ってます。 $x が 8, $y が 2 の場合は、`$x -$y` は 6 になり、`最初の引数のほうが二番目の引数より大きい場合は正の数を` を満たしてますよね? 8 のほうが 2 より大きいので 6 を返してるわけです。 あと、配列の中に 5 が 1 個しかないのに `5123456789` になるわけがないのでタイプミスだと思いますが、 コピペして2箇所エラーを修正した後 PHP Sandbox で実行してみたら、ちゃんと `512346789` になりましたよ。