351 文字
2 分
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で複数条件ソートできます。