コレクションを任意の順番で並び替える
PHPを使っていると、「任意に順番を並び替えたキーに沿って、連想配列を並び替えたい」ということが意外と面倒くさかったりする。
MySQLでいう ORDER BY FIELD(field, idx1, idx2, idx3) みたいなやつ。
Collectionクラスを用いると簡単にできそうだな〜と思ったのでメモ。
$order = [2, 1, 3];
$data = collection([
['id' => 1, 'name' => 'John'],
['id' => 2, 'name' => 'Alice'],
['id' => 3, 'name' => 'Yui'],
]);
$orderMap = array_flip($order);
$data = $data->sortBy(
function ($datum) use ($orderMap) {
return $orderMap[$datum->id];
},
SORT_ASC
)
->compile(false);
何をしているかというと、
- array_flipでもとの並び順を覚えさせて
- 対応順にarrayに位置を教えてあげる
というだけのもの。
Collectionクラスは、以前にQiitaにも書いた。
とても便利で強力なUtilityなので、使いこなしたい。