Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

前提条件

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

旧石器時代(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ならデフォルト値を使用するよくある処理を簡単に書ける。

ichi_404
`${ new Date().getFullYear() - 2015 }` 年目 PHP、JavaScript、猫と戯れる。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away