こんにちは!独学プログラマー&ライターのつぶらやです。
PHPでデータを配列に入れたのはいいけど並び方がバラバラ
並び方も、昇順降順ではなくもっと複雑に並び替えたい
そんな時に有効な関数がusortなどのsort関数です。
本日は以下の内容でお話していきます。
usortで並び替え
キーを変えずに並び替える(uasort関数)
キーで並び替える(uksort関数)
usortで並び替え
usortはコールバック関数です。
関数の引数に、別の関数を指定します。
そして、指定した別の関数の結果で比較をする事で並び替えが実現します。
一次元配列ではない、多次元配列の並び替えの時に使用します。
サンプルコードで実際の動きを見ていきましょう。
コメントの数字は後で解説する箇所です。
<?php function sort_test($right, $left){ // ② return strcmp($right["sports"], $left["sports"]); // ③ } $sports[0]['sports'] = 'tennis'; $sports[1]['sports'] = 'baseball'; $sports[2]['sports'] = 'swimming'; usort($sports, "sort_test"); // ① echo "<pre>"; print_r($sports); echo "</pre>"; ?>
結果 Array ( [0] => Array ( [sports] => baseball ) [1] => Array ( [sports] => swimming ) [2] => Array ( [sports] => tennis ) )
tennis→tennis→swimming となっていた配列が、baseball→swimming→tennis と並び替わりました。
プログラムの流れは、
並び替えたいデータを配列に入れる
↓
usortで関数を呼ぶ
↓
関数で比較をして並び替えを行う
という流れです。
それではコードの解説をしていきます。
①usortで関数を呼ぶ
第一引数に並び替えたい配列、第二引数に関数名を指定します。
②呼んだ関数に引数を設定する
$rightと$leftという変数を設定していますが、これは何でしょうか。
どこにも出てきていませんね。
実は、この第一、第二引数の変数の名称は何でも構わないのです。
この中には、自動的に比較する配列のデータが入ってきます。
③strcmpで比較
strcmpはPHPの比較の関数です。
以下のように比較結果で返る値が違います。
第一引数 < 第二引数の時、負の整数を返す
第一引数 > 第二引数の時、正の整数を返す
第一引数 = 第二引数の時、0を返す
usortで呼んだ関数の戻り値は、負の整数か正の整数か0である必要があります。
ところで、usortでの並び替えの結果は配列のキーも並び替えによって変わってしまっていました。
次章から、
・キーが変わらないように並び替える
・キーで並び替える
を実現するためのusortの関連の関数について解説していきます。
キーを変えずに並び替える(uasort関数)
配列のキーが変わらないように並び替えるuasort関数です。
usortのサンプルコードを少しだけ変更して結果を見てみます。
<?php function sort_test($right, $left){ return strcmp($right["sports"], $left["sports"]); } $sports[0]['sports'] = 'tennis'; $sports[1]['sports'] = 'baseball'; $sports[2]['sports'] = 'swimming'; usort($sports, "sort_test"); // usortをuasortに変更 echo "<pre>"; print_r($sports); echo "</pre>"; ?>
結果 Array ( [1] => Array ( [sports] => baseball ) [2] => Array ( [sports] => swimming ) [0] => Array ( [sports] => tennis ) )
比較した値の順番は並び替わりました。
そして配列のキーも元の値のままです。
配列のキーを変えたくないな場合に使いましょう。
キーで並び替える(uksort関数)
続いて、キーで並び替える関数、uksort関数の紹介です。
同じようにusortのサンプルコードを少し変更して結果を見てみます。
<?php function sort_test($right, $left){ return strcmp($right, $left); // キーのみ渡ってくるので記述を変更 } $sports[6]['sports'] = 'tennis'; $sports[4]['sports'] = 'baseball'; $sports[0]['sports'] = 'swimming'; uksort($sports, "sort_test"); // usortをuksortに変更 echo "<pre>"; print_r($sports); echo "</pre>"; ?>
結果 Array ( [0] => Array ( [sports] => swimming ) [4] => Array ( [sports] => baseball ) [6] => Array ( [sports] => tennis ) )
キー名で配列を並び替えることが出来ました。
まとめ
本日はPHPのusortについて解説しました。
配列の複雑な並び替えは少し理解するのが難しいかもしれません。
サンプルコードを実際に動かして理解を深めてください。
それでは、また。