3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHP usortユーザ定義ソートを使ってみる

Last updated at Posted at 2021-07-12

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を基準として昇順でソートするのが目標になります。

####前回の実装の流れ

  1. asortを使って昇順ソートする
  2. asortを多重配列で使う場合は、配列の最初の値が比較対象になる。
  3. fruitが対象なのでローマ字昇順になってしまう
  4. numを配列の最初に配置する
  5. 再び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で昇順ソートできておりますが、配列構造が変わっているので最適解ではありませんでした・・・

###ご教示頂いた実装の流れ

  1. usortを使ってユーザ定義でソートする
  2. 第二引数で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のビルトイン関数は常に進化し続けていることを実感しました・・・
ロジックを考えるのってやっぱり楽しいですし奥が深いです:smile:
ご教示頂いた皆様ありがとうございました!!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?