🐘
PHP:配列の中身がオブジェクトの場合に array_multisort で複数の値をソートする
PHPで「配列の中身がオブジェクト」の場合にarray_multisortを使って複数の値でソートしたい場合、まずソート対象のプロパティごとに配列を作成し、それを基準にarray_multisortを利用します。ただし、array_multisortは連想配列やオブジェクトには直接使えないため、array_columnやループで値を抽出する必要があります。
サンプル
たとえば、オブジェクト配列 $users を age 昇順→score 降順でソートしたい場合:
$users = [
(object)['name' => 'Tanaka', 'age' => 25, 'score' => 80],
(object)['name' => 'Suzuki', 'age' => 22, 'score' => 90],
(object)['name' => 'Yamada', 'age' => 25, 'score' => 70],
(object)['name' => 'Sato', 'age' => 22, 'score' => 80],
];
// 各プロパティごとに配列を作成
$ages = [];
$scores = [];
foreach ($users as $user) {
$ages[] = $user->age;
$scores[] = $user->score;
}
// array_multisortでソート
array_multisort($ages, SORT_ASC, $scores, SORT_DESC, $users);
// $usersが希望の順序に並び替えられる
この方法で、$users自体が並び替えられます。
ポイント
- array_multisortは値参照渡しなので、元の配列が直接並び替えられます。
- ソート基準となる各プロパティの配列を先に作成する必要があります。
- オブジェクト配列でも、プロパティごとの配列を作ればarray_multisortが使えます。
まとめ
- ソート基準ごとに値の配列を作成
- array_multisortで基準配列+元配列を一緒にソート
この手法で、オブジェクト配列もarray_multisortで複数条件ソートできます。
Discussion