PHP プログラミング

【PHP】配列・多次元配列のソート方法

配列のソート

昇順・降順でソート

sortで昇順のソート


$array = [1,5,3,2,4];

sort($array, SORT_NUMERIC);

// 出力
print_r($array);


出力結果


Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

rsortで降順のソート


$array = ['お','い','あ','う','え'];

rsort($array, SORT_STRING);

// 出力
print_r($array);


出力結果


Array
(
    [0] => お
    [1] => え
    [2] => う
    [3] => い
    [4] => あ
)

「sort」「rsort」共通オプション

意味
SORT_REGULAR 通常通りに項目を比較
SORT_NUMERIC 数値的に項目を比較
SORT_STRING 文字列として項目を比較
SORT_LOCALE_STRING 現在のロケールに基づいて比較
SORT_NATURAL 要素の比較を文字列として行い自然順で比較
SORT_FLAG_CASE SORT_STRING, SORT_NATURALとセットで使用。
ソートで大文字小文字を区別しない。

「SORT_NATURAL」

オプションの「SORT_NATURAL」を使用してみます。
「natsort()」に近い動きをするそうです。
枝番になったファイル名でも自然な順番でソートしてくれています。


$array = ['1_1.png','1_11.png','1_2.png','2_1.png','2_11.png','2_3.png'];

sort($array, SORT_NATURAL);

// 出力
print_r($array);


出力結果


Array
(
    [0] => 1_1.png
    [1] => 1_2.png
    [2] => 1_11.png
    [3] => 2_1.png
    [4] => 2_3.png
    [5] => 2_11.png
)

オプションを使わない出力結果
そうだけど、そうじゃない・・・ソート順ですね。


Array
(
    [0] => 1_1.png
    [1] => 1_11.png
    [2] => 1_2.png
    [3] => 2_1.png
    [4] => 2_11.png
    [5] => 2_3.png
)

ポイント

配列の要素によっては、「sort」も「rsort」も意図しない動きになることがあるので、
必ずオプションを付けて、明示的にソート方法を指定してあげましょう。

多次元配列のソート

array_columnを使用したソート

次の配列を「id」の昇順でソートします。


$array = [
  [
    'id' => 3,
    'product_name' => 'すいか',
    'price'  => 1500,
    'quantity' => 2
  ],
  [
    'id' => 0,
    'product_name' => 'りんご',
    'price'  => 250,
    'quantity' => 5
  ],
  [
    'id' => 2,
    'product_name' => 'メロン',
    'price'  => 2500,
    'quantity' => 1
  ],
  [
    'id' => 1,
    'product_name' => 'みかん',
    'price' => 300,
    'quantity' => 2
  ]
];

「id」をkeyにソートします。


// array_multisortの第二引数は
//「昇順:SORT_ASC」「降順:SORT_DESC 」が指定できます。
array_multisort(array_column($array, 'id'), SORT_ASC, $array);

// 出力
print_r($array);

出力結果

Array
(
    [0] => Array
        (
            [id] => 0
            [product_name] => りんご
            [price] => 250
            [quantity] => 5
        )
    [1] => Array
        (
            [id] => 1
            [product_name] => みかん
            [price] => 300
            [quantity] => 2
        )
    [2] => Array
        (
            [id] => 2
            [product_name] => メロン
            [price] => 2500
            [quantity] => 1
        )
    [3] => Array
        (
            [id] => 3
            [product_name] => すいか
            [price] => 1500
            [quantity] => 2
        )
)

ソート用カラムを使用してソート

価格と量のカラムがあるので、
合計金額が高い順にソートしてみたいと思います。


// ソート用の配列を作成
$sort_key = []; 

// 価格と量をかけて合計金額をソート用の配列に追加
foreach ($array as $key => $val) {
  $sort_key[$key] = $val['price'] * $val['quantity'];
}

// ソート用の配列をもとにソート(降順)
array_multisort($sort_key, SORT_DESC, $array);

// 出力
print_r($array);


出力結果

Array
(
    [0] => Array
        (
            [id] => 3
            [product_name] => すいか
            [price] => 1500
            [quantity] => 2
        )

    [1] => Array
        (
            [id] => 2
            [product_name] => メロン
            [price] => 2500
            [quantity] => 1
        )

    [2] => Array
        (
            [id] => 0
            [product_name] => りんご
            [price] => 250
            [quantity] => 5
        )

    [3] => Array
        (
            [id] => 1
            [product_name] => みかん
            [price] => 300
            [quantity] => 2
        )
)

ポイント

単一のカラムでソートする場合は、「array_column」を用いてあげましょう。
今回のケースのように計算後の値をソートに使用したい場合は、
ソート用の配列を用意してあげましょう。

  • この記事を書いた人
  • 最新記事

-PHP, プログラミング

© 2022 みるはぴ.com