Every Qiita #10
のんびり独学初学者の毎日投稿チャレンジ 10日目
今回は・・・
前回記事でご教示頂いたソートに関しての備忘録です。
@tadsanさんありがとうございました!
###前回の多重連想配列構造
$arrs = [
["fruit" => "apple" ,"num" => 1 ],
["fruit" => "banana" ,"num" => 3 ],
["fruit" => "melon" ,"num" => 5 ],
["fruit" => "orange" ,"num" => 4 ],
["fruit" => "peach" ,"num" => 2 ],
];
こちらをnumを基準として昇順でソートするのが目標になります。
####前回の実装の流れ
- asortを使って昇順ソートする
- asortを多重配列で使う場合は、配列の最初の値が比較対象になる。
- fruitが対象なのでローマ字昇順になってしまう
- numを配列の最初に配置する
- 再びasortで並び替える
下記ソースコード
//numとfruitの入れ替え
$replace_arrs=[];
foreach ($arrs as $key => $value) {
$replace_arrs[] = array_reverse($arrs[$key]);
}
//numを基準に昇順ソート
asort($replace_arrs);
foreach ($replace_arrs as $value) {
echo $value["num"].$value["fruit"]."<br>";
}
上記でもnumで昇順ソートできておりますが、配列構造が変わっているので最適解ではありませんでした・・・
###ご教示頂いた実装の流れ
- usortを使ってユーザ定義でソートする
- 第二引数でnumを指定し昇順ソート
下記ソースコード
usort($arrs, fn($a, $b) => $a['num'] <=> $b['num']);
これだけで構造を変えずにスマートにソートできるみたいです。すごい・・・
####解読
-
usort
:第一引数を配列、第二引数を比較関数で渡す。(比較関数の返り値は-1,0,1のいずれかである必要があります。)
配列の全てのパターンを比較し、-1であれば随時入れ替えるみたいです。条件は任意で決めることができます。 -
fn($a, $b) => $a['num'] <=> $b['num']
:アロー関数を使い、宇宙船演算子
でnumの値を比較処理しています。
上記は下記のコードと同等です。
// アロー関数で下記を簡略可
// 引数にはusort第一引数の配列が自動で全通り入ります
function fn($a, $b){
// 宇宙船演算子で下記を簡略可
if($a['num'] == $b['num']{
return 0;
}
return ($a['num'] < $b['num']) ? 1 : -1;
}
phpのビルトイン関数は常に進化し続けていることを実感しました・・・
ロジックを考えるのってやっぱり楽しいですし奥が深いです
ご教示頂いた皆様ありがとうございました!!