• HOME > 
  • PHP > 
  • PHPで多次元配列の並び替え(ソート)を行う【array_m...

PHPで多次元配列の並び替え(ソート)を行う【array_multisort】

投稿日:

このページにはGoogleアドセンス広告とアフィリエイト広告が含まれています。

カテゴリー記事のアイキャッチ画像
広告
広告

array_multisort関数について

LaravelでのWebアプリ制作の実務において、多次元配列のソートを行う状況があり、その際array_multisort関数について学んだので、覚えた内容を備忘録として残しておきます。

(※array_multisort関数について完全に理解できている訳ではないので、説明が至らない部分があることをご容赦ください。)

PHPで配列のソートを行う方法は他にもありますが、array_multisort関数を使えば、とても簡潔なコードで多次元配列を任意の条件・順序で並び替えを行うことができます。

array_multisortで並び替えを行う方法

array_multisort関数は次のように記述して引数を指定し、元となる配列のソートを行います。

array_multisortの書き方

実際に下の例で、「id」「name」「age」といったキーを持つ多次元連想配列に対して、array_multisortを用いてageキーの値が大きい順に並び替えを行ってみます。

array_columnと組み合わせて使う

array_multisortによる多次元配列の並び替えは、array_column関数と組み合わせて行います。

array_columnは、多次元配列から特定のカラムの値のみを抽出して新しい配列を生成する関数です。

array_columnについて詳しくはこちらのページをご覧ください。

PHP

$arr = [
    ['id' => 1, 'name' => '東京太郎', 'age' =>'24', 'furigana' => 'トウキョウタロウ'],
    ['id' => 2, 'name' => '埼玉次郎', 'age' =>'35', 'furigana' => 'サイタマジロウ'],
    ['id' => 3, 'name' => '千葉花子', 'age' =>'21', 'furigana' => 'チバハナコ'],
    ['id' => 4, 'name' => '神奈川一郎', 'age' =>'48', 'furigana' => 'カナガワイチロウ'],
];
$target_column = array_column($arr,'age');
array_multisort($target_column,SORT_DESC,$arr);
var_dump($arr);

上記のコードを説明すると…、

7行目array_columnを用いてageカラムの値だけを抽出し、ソートの基準となる配列($target_column)を用意します。

8行目array_multisortの引数に「ソートの基準となる配列($target_column)、「ソート順序(大きい順にしたいのでSORT_DESC)」、「ソートしたい配列($arr)」をセットします。

9行目元の配列が並び替えできているか、結果を確認します。

結果

array(4) {
    [0]=>
    array(4) {
        ["id"]=>
        int(4)
        ["name"]=>
        string(15) "神奈川一郎"
        ["age"]=>
        string(2) "48"
        ["furigana"]=>
        string(24) "カナガワイチロウ"
    }
    [1]=>
    array(4) {
        ["id"]=>
        int(2)
        ["name"]=>
        string(12) "埼玉次郎"
        ["age"]=>
        string(2) "35"
        ["furigana"]=>
        string(21) "サイタマジロウ"
    }
    [2]=>
    array(4) {
        ["id"]=>
        int(1)
        ["name"]=>
        string(12) "東京太郎"
        ["age"]=>
        string(2) "24"
        ["furigana"]=>
        string(24) "トウキョウタロウ"
    }
    [3]=>
    array(4) {
        ["id"]=>
        int(3)
        ["name"]=>
        string(12) "千葉花子"
        ["age"]=>
        string(2) "21"
        ["furigana"]=>
        string(15) "チバハナコ"
    }
}

元の配列を「age(年齢)」の数値が大きい順(DESC)に並び替えることができました。

2つ目の並び替え基準を設定する

並び替え基準(ソート基準)に同じ値が存在する場合には、引数を追加して2つ目のソート基準を設定しておくことで意図した順番に並び替えすることができます。

1つ目のソート基準において同じ値を持つレコードに関しては、2つ目のソート基準で並び替えが行われます。

先ほどの例の配列にageの値が重複するレコードを加え、重複した場合はidが大きい順に並ぶように指定してみたいと思います。

PHP

$arr = [
    ['id' => 1, 'name' => '東京太郎', 'age' =>'24', 'furigana' => 'トウキョウタロウ'],
    ['id' => 2, 'name' => '埼玉次郎', 'age' =>'35', 'furigana' => 'サイタマジロウ'],
    ['id' => 3, 'name' => '千葉花子', 'age' =>'21', 'furigana' => 'チバハナコ'],
    ['id' => 4, 'name' => '神奈川一郎', 'age' =>'48', 'furigana' => 'カナガワイチロウ'],
    ['id' => 5, 'name' => '茨城春子', 'age' =>'48', 'furigana' => 'イバラキハルコ'],
];
$target_column = array_column($arr,'age');
$target_column2 = array_column($arr,'id');
array_multisort(
    $target_column,
    SORT_DESC,
    $target_column2,
    SORT_DESC,
    $arr
);
var_dump($arr);

上記のコードを説明すると…、

6行目ageの値(48)が重複するレコードを加えました。

9行目同じようにarray_columnを用いてidカラムの値だけを抽出し、2つ目のソート基準となる配列($target_column2)を用意します。

13行目と14行目array_multisortの引数に2つ目の「ソートの基準となる配列($target_column2)、「ソート順序(大きい順にしたいのでSORT_DESC)」を追記します。

結果

array(5) {
    [0]=>
    array(4) {
        ["id"]=>
        int(5)
        ["name"]=>
        string(12) "茨城春子"
        ["age"]=>
        string(2) "48"
        ["furigana"]=>
        string(21) "イバラキハルコ"
    }
    [1]=>
    array(4) {
        ["id"]=>
        int(4)
        ["name"]=>
        string(15) "神奈川一郎"
        ["age"]=>
        string(2) "48"
        ["furigana"]=>
        string(24) "カナガワイチロウ"
    }
    [2]=>
    array(4) {
        ["id"]=>
        int(2)
        ["name"]=>
        string(12) "埼玉次郎"
        ["age"]=>
        string(2) "35"
        ["furigana"]=>
        string(21) "サイタマジロウ"
    }
    [3]=>
    array(4) {
        ["id"]=>
        int(1)
        ["name"]=>
        string(12) "東京太郎"
        ["age"]=>
        string(2) "24"
        ["furigana"]=>
        string(24) "トウキョウタロウ"
    }
    [4]=>
    array(4) {
        ["id"]=>
        int(3)
        ["name"]=>
        string(12) "千葉花子"
        ["age"]=>
        string(2) "21"
        ["furigana"]=>
        string(15) "チバハナコ"
    }
}

「age」の数値が大きい順かつ、その値が重複した場合は「id」の数値が大きい順に並び替えることができました。

文字を比較して並び替えを行う

並び替えの比較対象を文字列にしたい場合は、第4引数に「SORT_STRING」を設定します。

第4引数は省略可能であり、省略すると「SORT_REGULAR」が適用され、数値として比較されます。

例として、先ほどの配列に「age」キーの値が同じレコードをもう一つ追加し、重複した場合は「アイウエオ順」に並び替えてみます。

PHP

$arr = [
    ['id' => 1, 'name' => '東京太郎', 'age' =>'24', 'furigana' => 'トウキョウタロウ'],
    ['id' => 2, 'name' => '埼玉次郎', 'age' =>'35', 'furigana' => 'サイタマジロウ'],
    ['id' => 3, 'name' => '千葉花子', 'age' =>'21', 'furigana' => 'チバハナコ'],
    ['id' => 4, 'name' => '神奈川一郎', 'age' =>'48', 'furigana' => 'カナガワイチロウ'],
    ['id' => 5, 'name' => '茨城春子', 'age' =>'48', 'furigana' => 'イバラキハルコ'],
    ['id' => 6, 'name' => '栃木三郎', 'age' =>'48', 'furigana' => 'トチギサブロウ'],
];
$target_column = array_column($arr,'age');
$target_column3 = array_column($arr,'furigana');
array_multisort(
    $target_column,
    SORT_DESC,
    $target_column3,
    SORT_ASC,
    SORT_STRING,
    $arr
);
var_dump($arr);

上記のコードを説明すると…、

6行目ageの値(48)が重複するレコードを加えました。

9行目同じようにarray_columnを用いてfuriganaカラムの値だけを抽出し、2つ目のソート基準となる配列($target_column3)を用意します。

13行目と14行目array_multisortの引数に2つ目の「ソートの基準となる配列($target_column3)、「ソート順序(アイウエオ順にしたいのでSORT_ASC)」、「文字列なのでSORT_STRING」を追記します。

結果

array(6) {
    [0]=>
    array(4) {
        ["id"]=>
        int(5)
        ["name"]=>
        string(12) "茨城春子"
        ["age"]=>
        string(2) "48"
        ["furigana"]=>
        string(21) "イバラキハルコ"
    }
    [1]=>
    array(4) {
        ["id"]=>
        int(4)
        ["name"]=>
        string(15) "神奈川一郎"
        ["age"]=>
        string(2) "48"
        ["furigana"]=>
        string(24) "カナガワイチロウ"
    }
    [2]=>
    array(4) {
        ["id"]=>
        int(6)
        ["name"]=>
        string(12) "栃木三郎"
        ["age"]=>
        string(2) "48"
        ["furigana"]=>
        string(21) "トチギサブロウ"
    }
    //以下省略

まとめ

以上が、array_multisortを使ってPHPで多次元配列の並び替え(ソート)を行う方法です。

並び順はもちろん、2つ目3つ目のソート基準まで指定できるのでいろいろと役立つ関数だと感じました。

広告
広告

関連する記事

サムネイル

PHPで配列内を検索してインデックス番号を取得する【arra……

2024年07月03日
array_searchは、配列内から特定の値を検索し、見つかった場合はその値のキー(インデックス番号)を返す関数です。該当する値が複数ある場合は、はじめに見つかったインデックス番号を返します。
サムネイル

PHPで配列内に値が存在するか判定する【in_array】

2024年07月02日
PHPのin_arrayは、配列内に特定の値が存在するかを判定して、結果をtrueかfalseで返してくれる関数です。第一引数に「調べたい値」、第二引数に「対象の配列」を指定して判定を行います。
サムネイル

PHPで配列から特定の値を持つキーを全て取得する【array……

2024年07月02日
HPのarray_keys関数は対象の配列からすべてのキー、もしくは特定の値を持つキーを取得して新しい配列として返してくれる関数です。基本的には引数に配列と検索する値をセットして使用します。
サムネイル

PHPで配列の最小値や最大値を取得する【minとmax】

2024年06月13日
PHPのmin関数とmax関数はそれぞれ配列の最小値と最大値を取得できる関数です。引数に対象の配列を指定すると最小値や最大値を返します。
サムネイル

PHPで多次元配列から特定のカラムの値を取得する【array……

2024年05月29日
PHPのarray_columnは多次元配列の中から指定したカラムの値のみを抽出することができる関数です。抽出した値は新しい配列に格納されて返ってきます。
サムネイル

XAMPPでSSLを有効にする方法【httpsでアクセスでき……

2024年04月12日
XAMPPをSSL化してhttpsでアクセスできるようにするには、設定ファイルの変更と証明書の作成が必要です。