- ベストアンサー
PHP の スペースシップ演算子について
お世話になります。 PHP の スペースシップ演算子について、使い方をネットで調べていましたら、次のようなコードを見つけました。 この中で、配列の並べ替えのための usort( ) のコールバック関数としている my_sort( ) の中で、<=> 演算子が使われています。この演算子は左側と右側のオペランドを比べて -1, 0, 1 のいずれかを返すということなのですが、この戻り値がどのように配列の要素を並べ替えるのに使われているのか、そのメカニズムが理解できません。 どなたか詳しく説明していただけると有難く思います。どうかよろしくお願いいたします。 function my_sort($a, $b) { return $a <=> $b; } $ary = array(4, 2, 8, 6, 1, 3); usort($ary, 'my_sort'); echo "<pre>"; print_r($ary); echo "</pre>"; この結果は 以下の様です。 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 6 [5] => 8 )
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
usort() は配列の値を順次コールバック関数に渡し、コールバック関数の戻り値が正の整数の場合第1引数の値が大きい、負の整数の場合第2引数の値が大きい、ゼロの場合は第1引数と第2引数の値が等しいモノと判断し並べ替えを行います。 https://www.php.net/manual/ja/function.usort.php
その他の回答 (1)
- luka3
- ベストアンサー率72% (424/583)
usort関数を自作しようとすると、こんな感じになると思います。 function my_usort(&$array, $callback_func) { $n = count($array); for ($i = 0; $i < $n; $i++) { for ($j = 0; $j < ($n - 1 - $i); $j++) { if ($callback_func($array[$j + 1], $array[$j]) < 0) { $tmp = $array[$j + 1]; $array[$j + 1] = $array[$j]; $array[$j] = $tmp; } } } } ソート関数はこちらのページのものを参考にしました。 https://qiita.com/lalala_s/questions/132ad8565bdeca35b706 質問者さんのプログラムで usort を my_usort にして同じ結果になることを確認しています。 $callback_func が使われている行を元のソースと比較していただくと、理解の助けになるのではないでしょうか。 もちろん、実際の usort の中身がこんな単純ではないと思いますが。
お礼
早速にご回答をいただきまして、有難うございます。 つまりコールバック関数に渡す引数は、元の配列の要素で、例えば$a は配列から一つずつ順番に持ってくる要素で、$b はそれと比較するために一つずつ順番に持ってくる残りの要素で、それらの二つの値は usort( ) 関数からコールバック関数に渡されるのですね? そしてコールバック関数から比較の結果返された値により$a と$bの順番を入れ替えるという操作を、usort( ) 関数の内部で、すべての要素の組み合わせに実行していると 考えていいのでしょうか? つまり、コールバック関数そのものがすることは、二つの要素の大きさを比較して、usort( ) に渡すだけという事だけど、usort( ) は 受け取った-1, 0,1 のいずれかによって、$a と$b のどちらを先に並べるべきかを判断して、配列内での入れ替えをするという事ですね? 関係する二つの関数の役割がよくわかりました。 有難うございました。