LoginSignup
1
0

More than 5 years have passed since last update.

並べ替え用の配列定数と宇宙船演算子でソートがとてもやりやすい

Posted at

前提条件

  • 並べ替え用のオーダーが設定ファイルなどで定義されている
  • オーダーの降順に並び替える
  • 順序未定義の物は最後へ

旧石器時代(5.3あたり)

$order = array('hoge' => 3, 'fuga' => 2, 'foo' => 1);
$arr   = array('foo', 'hoge', 'baz', 'fuga');
usort($arr, function($a, $b) use($order) {
  // オーダーが存在しなければ-1にする
  $a = isset($order[$a]) ? $order[$a] : -1;
  $b = isset($order[$b]) ? $order[$b] : -1;

  if ($a < $b) {
    return 1;
  } elseif ($a > $b) {
    return -1;
  } else {
    return 0;
  }
});
var_dump($arr);
// array(4) {
// [0]=>
// string(4) "hoge"
// [1]=>
// string(4) "fuga"
// [2]=>
// string(3) "foo"
// [3]=>
// string(3) "baz"
// }

現代

const ORDER = ['hoge' => 3, 'fuga' => 2, 'foo' => 1];
$arr = ['foo', 'hoge', 'baz', 'fuga'];
usort($arr, function($a, $b) {
  return (ORDER[$b] ?? -1) <=> (ORDER[$a] ?? -1);
});
var_dump($arr);
// array(4) {
// [0]=>
// string(4) "hoge"
// [1]=>
// string(4) "fuga"
// [2]=>
// string(3) "foo"
// [3]=>
// string(3) "baz"
// }

まとめ

配列 []

PHP5.4からシンプルに書けるように。

定数定義 const

PHP5.6から定数に配列が利用可能に。
※define定数も7.0以降は配列定数の定義が可能です。

クロージャに変数を引き継ぐ use

PHPではクロージャ外の変数をバインドするのに use($hoge) を使う必要があります。
JavaScriptから比べるとちょっとめんどい。
なので現代版はグローバルスコープの定数を使用して回避しています。
今回は簡易化のためにクラスにはしていませんがクラス内で const 定数を使えば、スコープがクラス内に限定されるので使い勝手がいいです。

宇宙船演算子 <=>

PHP7.0から導入。
比較処理のために作られたような演算子。a>bなら1、a<bなら-1、a=bなら0を返す。

null合体演算子 ??

PHP7.0から導入。
nullならデフォルト値を使用するよくある処理を簡単に書ける。

1
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
1
0