PHPで配列をソートする方法一覧

PHPで配列を並び替える(ソートする)時に使用できる関数についてまとめました。

すべての関数に実行サンプルコードも合わせて載せていますので、用途に応じて確認してください。

ソートの方向「昇順」と「降順」の違いと覚え方

まずは配列のソートで頻発する用語、「昇順」と「降順」について100%理解しておきましょう。

  • 小さい順⇒昇順
  • 大きい順⇒降順

昇順と降順は階段をイメージして頂くと分かりやすいです。

昇順は階段を上る、つまり0段目から1段、2段と上っていくので、数え方は少ない数字から、すなわち小さい順に並び替えます。

逆に降順は5段目から4段目、3段目と下っていくので、数え方は大きい数字から、つまり大きい順という意味です。

値でソートする(キーは連番)

配列の値のソートは、昇順はsort()、降順はrsort()という関数を使用します。

sort(昇順)

サンプルコード
$aryHoge = [100, 50, 500, 200, 10000];
sort($aryHoge);
print_r($aryHoge);
Array
(
    [0] => 50
    [1] => 100
    [2] => 200
    [3] => 500
    [4] => 10000
)

rsort(降順)

サンプルコード
$aryHoge = [100, 50, 500, 200, 10000];
rsort($aryHoge);
print_r($aryHoge);
Array
(
    [0] => 10000
    [1] => 500
    [2] => 200
    [3] => 100
    [4] => 50
)

【注意】キー(添え字)は自動的に連番に変更される

sort()、rsort()は値のソート時に、自動的にキーが連番に変更されてしまいます。

キーが変更されてしまうため、キーに文字列を含む連想配列でこのソートを行うと、文字列が消滅します。

サンプルコード
$aryHoge = ['Tanaka' => 100, 'Suzuki' => 50, 'Yamada' => 500, 'Aoki' => 200, 'Fujita' => 10000];
sort($aryHoge);
print_r($aryHoge); //キーの文字列が消滅している
Array
(
    [0] => 50
    [1] => 100
    [2] => 200
    [3] => 500
    [4] => 10000
)

連想配列のように、キーと値の関係性を保持した上でソートを行いたい場合は、後述のasort()、arsort()、ksort()、krsort()を使用します。

値でソートする(キーと値の相互関係を保持)

キーと値の関係性を保持したまま、値のソートを行いたい場合はasort(昇順)、arsort(降順)を使用します。

主に連想配列で、キーと値の関係を崩したくない状態でソートを行うのに便利です。

asort(昇順)

サンプルコード
$aryHoge = ['Tanaka' => 100
            ,'Suzuki' => 50
            ,'Yamada' => 500
            ,'Aoki' => 200
            ,'Fujita' => 10000];
asort($aryHoge);
print_r($aryHoge);
Array
(
    [Suzuki] => 50
    [Tanaka] => 100
    [Aoki] => 200
    [Yamada] => 500
    [Fujita] => 10000
)

arsort(降順)

サンプルコード
$aryHoge = ['Tanaka' => 100
            ,'Suzuki' => 50
            ,'Yamada' => 500
            ,'Aoki' => 200
            ,'Fujita' => 10000];
arsort($aryHoge);
print_r($aryHoge);
Array
(
    [Fujita] => 10000
    [Yamada] => 500
    [Aoki] => 200
    [Tanaka] => 100
    [Suzuki] => 50
)

キーでソートする(キーと値の相互関係を保持)

配列のキーでソートを行いたい場合はksort(昇順)、krsort(降順)を使用します。

値との関係性も保持されるため、連想配列での使用も安心です。

ksort(昇順)

サンプルコード
$aryHoge = ['Tanaka' => 100
            ,'Suzuki' => 50
            ,'Yamada' => 500
            ,'Aoki' => 200
            ,'Fujita' => 10000];
ksort($aryHoge);
print_r($aryHoge);
Array
(
    [Aoki] => 200
    [Fujita] => 10000
    [Suzuki] => 50
    [Tanaka] => 100
    [Yamada] => 500
)

krsort(降順)

サンプルコード
$aryHoge = ['Tanaka' => 100
            ,'Suzuki' => 50
            ,'Yamada' => 500
            ,'Aoki' => 200
            ,'Fujita' => 10000];
krsort($aryHoge);
print_r($aryHoge);
Array
(
    [Yamada] => 500
    [Tanaka] => 100
    [Suzuki] => 50
    [Fujita] => 10000
    [Aoki] => 200
)

キーの文字列がしっかりアルファベット順でソートされていることが分かります。

多次元配列をソートするarray_multisort

配列の中に配列を含む多次元配列のソートはarray_multisort()関数を使用します。

array_multisortを使用するにあたって、ソートしたい項目を取り出し配列を生成する処理が必要になります。

サンプルコード
$aryHoge = [
    0 => ['name' => 'Tanaka', 'Sugaku' => 100, 'Eigo' => 100],
    1 => ['name' => 'Suzuki', 'Sugaku' => 70, 'Eigo' => 100],
    2 => ['name' => 'Yamada', 'Sugaku' => 80, 'Eigo' => 100],
    3 => ['name' => 'Aoki', 'Sugaku' => 85, 'Eigo' => 90],
    4 => ['name' => 'Fujita', 'Sugaku' => 60, 'Eigo' => 80]
];

//foreachでソートしたい値を取り出す
$arySort = [];
foreach($aryHoge as $key => $value){
  $arySort[$key] = $value['Sugaku'];
}
 
//昇順に並び替える
array_multisort($arySort, SORT_ASC, $aryHoge);
//降順の場合はSORT_DESCに変更
//array_multisort($arySort, SORT_DESC, $aryHoge);

print_r($aryHoge);
Array
(
    [0] => Array
        (
            [name] => Fujita
            [Sugaku] => 60
            [Eigo] => 80
        )

    [1] => Array
        (
            [name] => Suzuki
            [Sugaku] => 70
            [Eigo] => 100
        )

    [2] => Array
        (
            [name] => Yamada
            [Sugaku] => 80
            [Eigo] => 100
        )

    [3] => Array
        (
            [name] => Aoki
            [Sugaku] => 85
            [Eigo] => 90
        )

    [4] => Array
        (
            [name] => Tanaka
            [Sugaku] => 100
            [Eigo] => 100
        )

)

「Sugaku」の昇順になっていることが分かります。

複数の値でソートを行いたい場合(同率順位処理)

array_multisortは複数の配列を指定することが出来ます。

もし、「英語の点数の高い順、同率の場合は数学の高い順」としてソートしたい場合は、foreachで複数の配列を取得しておく必要があります。

サンプルコード
$aryHoge = [
    0 => ['name' => 'Tanaka', 'Sugaku' => 100, 'Eigo' => 100],
    1 => ['name' => 'Suzuki', 'Sugaku' => 70, 'Eigo' => 100],
    2 => ['name' => 'Yamada', 'Sugaku' => 80, 'Eigo' => 100],
    3 => ['name' => 'Aoki', 'Sugaku' => 85, 'Eigo' => 90],
    4 => ['name' => 'Fujita', 'Sugaku' => 60, 'Eigo' => 80]
];

//foreachでソートしたい値を取り出す
$arySort = [];
foreach($aryHoge as $key => $value){
  $arySortEi[$key] = $value['Eigo'];
  $arySortSu[$key] = $value['Sugaku'];
}

//英語の高い順、数学の高い順の優先度でソート
array_multisort(
    $arySortEi, SORT_DESC,
    $arySortSu, SORT_DESC,
    $aryHoge
);

print_r($aryHoge);
Array
(
    [0] => Array
        (
            [name] => Tanaka
            [Sugaku] => 100
            [Eigo] => 100
        )

    [1] => Array
        (
            [name] => Yamada
            [Sugaku] => 80
            [Eigo] => 100
        )

    [2] => Array
        (
            [name] => Suzuki
            [Sugaku] => 70
            [Eigo] => 100
        )

    [3] => Array
        (
            [name] => Aoki
            [Sugaku] => 85
            [Eigo] => 90
        )

    [4] => Array
        (
            [name] => Fujita
            [Sugaku] => 60
            [Eigo] => 80
        )

)

PHP5.5以上の方の便利なソート方法

PHP5.5からはarray_columnという便利な記述が使えます。

array_columnは、指定したカラムのみの配列を返してくれるため、foreachの繰り返しで配列を生成する下準備を不要にできます。

サンプルコード
$aryHoge = [
    0 => ['name' => 'Tanaka', 'Sugaku' => 100, 'Eigo' => 100],
    1 => ['name' => 'Suzuki', 'Sugaku' => 70, 'Eigo' => 100],
    2 => ['name' => 'Yamada', 'Sugaku' => 80, 'Eigo' => 100],
    3 => ['name' => 'Aoki', 'Sugaku' => 85, 'Eigo' => 90],
    4 => ['name' => 'Fujita', 'Sugaku' => 60, 'Eigo' => 80]
];
 
//数学の昇順 この一行で済む
array_multisort(array_column($aryHoge, 'Sugaku'), SORT_ASC, $aryHoge);

print_r($aryHoge);
Array
(
    [0] => Array
        (
            [name] => Fujita
            [Sugaku] => 60
            [Eigo] => 80
        )

    [1] => Array
        (
            [name] => Suzuki
            [Sugaku] => 70
            [Eigo] => 100
        )

    [2] => Array
        (
            [name] => Yamada
            [Sugaku] => 80
            [Eigo] => 100
        )

    [3] => Array
        (
            [name] => Aoki
            [Sugaku] => 85
            [Eigo] => 90
        )

    [4] => Array
        (
            [name] => Tanaka
            [Sugaku] => 100
            [Eigo] => 100
        )

)

まとめ

今回紹介した各種ソート系の配列をまとめました。

ソートの対象 ソートの向き キーと値の関係
sort 昇順 破棄
rsort 降順 破棄
asort 昇順 維持
arsort 降順 維持
ksort キー 昇順 維持
krsort キー 降順 維持

これらのソート系関数に加えて、多次元配列に対応した「array_multisort」は覚えておきましょう。

以上、PHPで配列をソートする方法一覧、でした。

コメント

タイトルとURLをコピーしました