バックエンド

PHPで多次元配列のソート方法

はじめに

PHPで多次元配列を特定の条件でソートしたいときがあります。
少し使い方にクセがあるので例を元に説明します。

対象の多次元配列

$data = [
    ['2021-05-01', 1, 'hoge'],
    ['2021-04-02', 2, 'fuga'],
    ['2021-05-02', 3, 'piyo']
];

上記のような多次元配列があり、年月日でソートを行います。
このときに使用する関数はarray_multisortを使用します。

array_multisortの使い方

array_multisort関数の具体的な使い方を説明してきます。

実装例

$data = [
    ['2021-05-01', 1, 'hoge'],
    ['2021-04-02', 2, 'fuga'],
    ['2021-05-02', 3, 'piyo']
];
array_multisort(               // 3
    array_map("strtotime",     // 2
        array_column($data, 0) // 1
    ),
    SORT_ASC,
    $data
);
var_dump($data);

ここから上記実装を一つ一つ説明していきます。

1. array_column関数について

array_column($data, 0)$data配列から単一のカラムの値を返します。
ここでは下記のようなデータが返ってきます。

array(3) {
  [0]=>
  string(10) "2021-05-01"
  [1]=>
  string(10) "2021-04-02"
  [2]=>
  string(10) "2021-05-02"
}

2. array_map関数について

array_column関数で返ってきた日付文字列の配列要素一つずつにarray_map関数を使い処理を行います。
strtotime関数で文字列をUnixタイムスタンプに変換します。
結果、下記のような配列が返ってきます。

array(3) {
  [0]=>
  int(1619827200)
  [1]=>
  int(1617321600)
  [2]=>
  int(1619913600)
}

3. array_multisort関数について

array_map関数で返ってきた配列をSORT_ASCで昇順並びに変更します。
元の$data配列をSORT_ASCで並び替えた順序に対応します。
以下、最終的な$dataの配列の形です。

array(3) {
  [0]=>
  array(3) {
    [0]=>
    string(10) "2021-04-02"
    [1]=>
    int(2)
    [2]=>
    string(4) "fuga"
  }
  [1]=>
  array(3) {
    [0]=>
    string(10) "2021-05-01"
    [1]=>
    int(1)
    [2]=>
    string(4) "hoge"
  }
  [2]=>
  array(3) {
    [0]=>
    string(10) "2021-05-02"
    [1]=>
    int(3)
    [2]=>
    string(4) "piyo"
  }
}

array_multisortには複数の配列を与えることができます。
array_multisortは与える配列の要素数はすべて同じである必要があります。
最初の配列をソートし同じ要素があった場合、後に続く配列の要素を使い順番を決めます。

まとめ

今回は多次元配列のソートする方法を紹介しました。
多次元配列は使用する場面も多いと思いますので、ソートする方法に迷ったら参考にしてみてください。

-バックエンド
-