一次元、連想配列、多次元配列のソート

array_reverse()

array_reverse()は配列の要素を逆順に並び替えます。第二引数がtrueの場合、キーの値は保持されます。初期値はfalse。連想配列ではtrueを指定。非数値のキーは、この設定にかかわらず常に保持されます。

1
2
3
4
5
6
7
8
9
$a=[
"jQuery" => "クライアントサイドA",
"php" => "サーバサイド",
"css" => "クライアントサイドB",
];
$a=array_reverse($a);
foreach($a as $key => $val){
echo $key.':'.$val.'。';
}

実行結果:css:クライアントサイドB。php:サーバサイド。jQuery:クライアントサイドA。

shuffle()

shuffle()は配列の要素の順番をランダムにします。すでに割り当てられている既存のキーを削除して新しいキーを割り当てます。以下の連想配列では「jQuery」「php」「css」のキーが削除されて、整数値がランダムに割り当てられます。また結果は実行するたびに順番がランダムになりますので、以下のコードの実行結果は一例で、改行も加えて見やすくしています。

1
2
3
4
5
6
7
8
9
10
11
12
$a=[
"jQuery" => "Client sideA",
"php" => "Server side",
"css" => "Client sideB",
];
// 代入してforeachに渡すとエラーになる。
shuffle($a);
foreach($a as $ke => $va){
echo $ke.':'.$va.'。';
}
//print_r()関数は指定した変数や式に関する情報を分かりやすく出力します。
print_r($a);
実行結果:
0:Client sideB。1:Client sideA。2:Server side。
Array
(
[0] => Client sideB
[1] => Client sideA
[2] => Server side
)

sort()とasort()

sort()とasort()はいずれも配列の「きー」に対する要素を昇順に並び替えます。また、sort()は「きー」を一旦削除してから新しいキーナンバー(整数)を割り当てますので、連想配列の「きー」に文字列を割り当てている場合は強制的に整数値へと置換されます。これに対し、asort()では連想配列のキーを保持して昇順に並び替えます。いずれも第二引数にオプションを設定できますが、指定しなくてもデフォルトで型の自動変換機能が備わっています。ちなみにオプションの「SORT_REGULAR」はデフォルト、「SORT_NUMERIC」は数値比較、「SORT_STRING」は文字列比較、「SORT_LOCALE_STRING」はロケール情報に基づいて文字列比較、「SORT_NATURAL」は要素比較を文字列として行い、自然順で比較します。「SORT_FLAG_CASE」は大文字小文字を区別せずに比較し、SORT_STRINGやSORT_NATURALと組み合わせて利用します。

1
2
3
4
5
6
7
8
9
$a=[
"jQuery" => "2",
"perl" => "3",
"css" => "1",
];
asort($a);
foreach($a as $k => $v){
echo $k.':'.$v.'。';
}
実行結果:css:1。jQuery:2。perl:3。

rsort()とarsort()

rsort()は、配列の既存の「きー」を削除して新たに整数の「きー」を割り当てて降順で並び替えます。sort()の反対の動作をします。arsort()は「きー」に対する要素を保持しながら要素を降順に並び替えます。こちらはasort()の反対の動作をします。いずれもオプション指定可能で、上記のsort()とasort()を参照して下さい。

1
2
3
4
5
6
7
8
9
$a=[
"jQuery" => "2",
"perl" => "3",
"css" => "1",
];
arsort($a);
foreach($a as $k => $v){
echo $k.':'.$v.'。';
}
実行結果:perl:3。jQuery:2。css:1。

ksort()とkrsort()

ksort()は配列のキーを昇順に、krsort()は配列のキーを降順に並び替えます。どちらもオプション設定可能で、上記のsort()とasort()を参照して下さい。以下の構文はキーを降順にしたkrsort()の例です。

1
2
3
4
5
6
7
8
9
$a=[
"2" => "jQueryA",
"3" => "perl",
"1" => "cssB",
];
krsort($a);
foreach($a as $k => $v){
echo $k.':'.$v.'。';
}
実行結果:3:perl。2:jQueryA。1:cssB。

usort()、uksort()、uasort()

usort()は、配列の要素の値とユーザー定義関数を使って並び替えます。uksort()はキーとユーザー定義関数を使って並び替えます。uasort()はキーを保持したままユーザー定義関数を使って配列を並び替えます。書式は、「usort(配列, 比較関数);」で、uksort()、uasort()も同じです。比較関数は(値1, 値2)として、二つの値を使います。昇順にするには「値1<値2」であれば-1、「値1>値2」であれば1、両者が同じであれば0を返す必要があり、降順にするには「値1>値2」であれば-1、「値1<値2」であれば1、両者が同じであれば0を返す必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$c=[
"クライアント側A",
"サーバサイド",
"クライアントサイドB",
];
usort($c, function ($a,$b){
$a2=mb_strlen($a, "UTF-8");
$b2=mb_strlen($b, "UTF-8");
if ($a2 == $b2) {
return 0;
}
// ()内の条件式がtrueなら-1、falseなら1を返します。(三項演算子)
// また、比較演算子を「>」にすると降順、「<」にすると昇順になります。
return ($a2 > $b2) ? -1 : 1;
});
foreach($c as $key => $val){
echo $key.':'.$val.'。';
}
実行結果:0:クライアントサイドB。1:クライアント側A。2:サーバサイド。

以下は上の書式を短くしたものです。

1
2
3
4
5
6
7
8
9
10
11
$c=[
"クライアント側A",
"サーバサイド",
"クライアントサイドB",
];
// 無名関数を使って文字数の多い順(降順)に並び替えています。
// 昇順にする場合は、return文の$a$bを入れ替えます。
usort($c, function ($a,$b){return mb_strlen($b, "UTF-8") - mb_strlen($a, "UTF-8");});
foreach($c as $key => $val){
echo $key.':'.$val.'。';
}
実行結果:0:クライアントサイドB。1:クライアント側A。2:サーバサイド。

array_multisort()

array_multisort()は複数の配列のキーに対する要素を昇順の「SORT_ASC」と降順の「SORT_DESC」オプションを使って並び替えます。オプションに何も指定しなければ「SORT_ASC」が自動で選択されます。複数の配列を扱う訳ですが、array_multisort()では最初のソートオプションのパターンが採用され、二番目以降はそれに準じた処理をします。書式は「array_multisort(処理するために必要な新たに作成した配列, 複数指定できるオプション, 元の配列);」です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$a=[
[
"id" => "2",
"ニックネーム" => "A",
"年齢" => "20歳",
"好きな果物" => "りんご",
],
[
"id" => "1",
"ニックネーム" => "C",
"年齢" => "30歳",
"好きな果物" => "すいか",
],
[
"id" => "3",
"ニックネーム" => "B",
"年齢" => "40歳",
"好きな果物" => "れもん",
],
];
foreach($a as $key => $val){
// ループ中に回ってきた$valのキーに「年齢」を入れて、同じく回ってきた$keyを新たな$arrayに入れて新たな配列を作成。
$array[$key] = $val['年齢'];
}
// 昇順のみであればオプションは必要ありません。
// 下のarray_multisortは降順で数値比較を指定しています。
// 「SORT_NUMERIC」を指定すると先頭が数字で続き、その後に文字列を入れた値でも認識します。
array_multisort($array, SORT_DESC,SORT_NUMERIC, $a);
echo "
<pre>";
print_r($a);
echo "</pre>
";
実行結果:

Array
(
    [0] => Array
        (
            [id] => 3
            [ニックネーム] => B
            [年齢] => 40歳
            [好きな果物] => れもん
        )

    [1] => Array
        (
            [id] => 1
            [ニックネーム] => C
            [年齢] => 30歳
            [好きな果物] => すいか
        )

    [2] => Array
        (
            [id] => 2
            [ニックネーム] => A
            [年齢] => 20歳
            [好きな果物] => りんご
        )

)

natsort()とnatcasesort()

natsort()は自然順のアルゴリズムです。natcasesort()は大文字小文字を区別しません。array_multisort()では値の先頭に日本語を記述すると「SORT_NUMERIC」を指定しても認識できませんでした。natsort()では認識できるようです。尚、比較結果が等しくなる二つの要素があれば、ソート後の配列では、これらの並び順は不定になります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$a=[
[
"id" => "2",
"ニックネーム" => "A",
"年齢" => "満20歳",
"好きな果物" => "りんご",
],
[
"id" => "1",
"ニックネーム" => "C",
"年齢" => "満30歳",
"好きな果物" => "すいか",
],
[
"id" => "3",
"ニックネーム" => "B",
"年齢" => "満40歳",
"好きな果物" => "れもん",
],
];
natsort($a);
echo "
<pre>";
print_r($a);
echo "</pre>
";
実行結果:

Array
(
    [0] => Array
        (
            [id] => 2
            [ニックネーム] => A
            [年齢] => 満20歳
            [好きな果物] => りんご
        )

    [1] => Array
        (
            [id] => 1
            [ニックネーム] => C
            [年齢] => 満30歳
            [好きな果物] => すいか
        )

    [2] => Array
        (
            [id] => 3
            [ニックネーム] => B
            [年齢] => 満40歳
            [好きな果物] => れもん
        )

)