array_multisortで多次元配列を並べ替える考え方
array_multisortは、複数の配列をまとめてソートしたり、多次元配列を特定の項目で並べ替えたりするための関数です。商品データのように、1行が1商品を表す配列では、ソート基準となる列を取り出し、その列と元の多次元配列を一緒に渡します。
たとえば、商品名・価格・在庫数を持つデータから価格だけを取り出し、価格の並び替えに合わせて商品データ全体も並べ替えます。
flowchart LR
A[商品データ] --> B[価格の列を取り出す]
B --> C[array_multisortでソート]
A --> C
C --> D[行の対応を保った並べ替え]図を表示できませんでした。Mermaidコードを確認してください。
array_multisortは配列を参照渡しで受け取り、ソート後の配列を直接変更します。数値添字は振り直され、文字列キーは維持されます。
具体例で確認する基本的な並べ替え手順
次の例では、商品データを価格の昇順に並べ替えます。array_columnで価格の列を作り、その配列と商品データをarray_multisortへ渡します。価格を数値として比較するため、SORT_NUMERICも指定しています。
<?php
$products = [
['name' => 'キーボード', 'price' => 6800, 'stock' => 12],
['name' => 'マウス', 'price' => 3200, 'stock' => 25],
['name' => 'モニター', 'price' => 19800, 'stock' => 5],
];
$prices = array_column($products, 'price');
// 価格の昇順に並べ替え、$productsも同じ順序に調整する
array_multisort($prices, SORT_ASC, SORT_NUMERIC, $products);
print_r($products);
// 期待される並び順: マウス、キーボード、モニター
// 実行時の表示形式や細部はPHPのバージョン・環境で確認してください。重要なのは、ソート用の$pricesを先に渡し、最後に関連付けたい$productsを渡すことです。これにより、価格だけでなく、商品名や在庫数も同じ行のまま移動します。
昇順・降順と複数条件を指定する方法
並べ替え方向はSORT_ASCが昇順、SORT_DESCが降順です。複数の配列を指定した場合、先に指定した配列が優先され、同じ値の範囲では後続の配列が比較に使われます。
| 条件 | 指定例 | 用途 |
|---|---|---|
| 第1条件 | $prices, SORT_ASC, SORT_NUMERIC | 価格の安い順 |
| 第1条件 | $prices, SORT_DESC, SORT_NUMERIC | 価格の高い順 |
| 第2条件 | $stocks, SORT_DESC, SORT_NUMERIC | 価格が同じ場合に在庫数の多い順 |
<?php
$products = [
['name' => 'A商品', 'price' => 3000, 'stock' => 8],
['name' => 'B商品', 'price' => 2000, 'stock' => 4],
['name' => 'C商品', 'price' => 3000, 'stock' => 15],
];
$prices = array_column($products, 'price');
$stocks = array_column($products, 'stock');
// 価格の昇順、価格が同じ場合は在庫数の降順
array_multisort(
$prices, SORT_ASC, SORT_NUMERIC,
$stocks, SORT_DESC, SORT_NUMERIC,
$products
);
print_r($products);
// 期待される順序: B商品、C商品、A商品
// 実行時は対象PHP環境で結果を確認してください。この例では、まず価格の安い商品が先になります。C商品とA商品は価格が同じため、在庫数の多いC商品が先に並びます。
実務で使うときに確認したいデータと注意点
- 各要素に、ソート対象のキーが同じ名前で存在するか確認する。
- 価格や数量を数値として比較する場合は、SORT_NUMERICの指定と入力値の型を確認する。
- array_multisortは対象配列を変更するため、元データを残したい場合はコピーを用意する。
- 数値添字は振り直されるため、元の添字を識別子として使う場合は別途保持する。
- 大量データでは、データベースのORDER BYや別のソート方法も、件数・可読性・保守性を見て検討する。
特に、価格が文字列として格納されている場合や、数値と文字列が混在している場合は、意図した比較にならない可能性があります。実際のデータ形式を確認し、必要に応じて入力時点で型をそろえてください。
array_multisortを使った実装を検証するチェック手順
- 並べ替え前のデータ、基準項目、期待する順序を決める。
- まずは1条件だけでソートし、商品名・価格・在庫数の対応が崩れていないか確認する。
- 同じ価格の商品を追加し、第2条件の優先順位を確認する。
- 空配列、キー不足、要素数の異なるソート用配列などもテストする。
- 利用中のPHPバージョンでコードを実行し、キーや比較結果が要件どおりか確認してから採用する。
array_multisortは便利ですが、ソート対象の列と元データの要素数や順序が対応していることが前提です。まず小さなサンプルで動きを確認し、その後に実データへ適用すると安全です。