PHP | 配列、連想配列のソート方法と役立つサンプルまとめ

Code:

// 配列 値 昇順
sort($array, $flag = SORT_REGULAR);
// 配列 値 降順
rsort($array, $flag = SORT_REGULAR);
// 連想配列 key 昇順
ksort($array, $flag = SORT_REGULAR);
// 連想配列 key 降順
krsort($array, $flag = SORT_REGULAR);
// 配列・連想配列 key ユーザー定義関数でソート
uksort($array, function);
// 連想配列 値 昇順
ksort($array, $flag = SORT_REGULAR);
// 連想配列 値 降順
krsort($array, $flag = SORT_REGULAR);
// 配列 自然順アルゴリズムでソート (昇順)
natsort($array);
// 配列・連想配列 値 ユーザー定義関数でソート
uksort($array, function);
// 配列・連想配列 値 シャッフル
shuffle($array);
配列・連想配列のまたは、キーを並び変える関数を紹介していきます。
破壊的関数なので、引数として渡した配列の順番が変わります。
戻り値は常にboolean(true)を返します。破壊的関数ではなく、戻り値としてソートされた配列を返してくれればいいのに、と常々思うところではあります。

    もくじ

  1. 使い方
  2. サンプル
  3. まとめ

使い方

配列の値を昇順ににソート sort

Code:

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

Result:

array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}
配列の値を昇順で並び替えます。
後述のrsortと同様に、連想配列を渡した場合には配列へとキャストされてしまう(キーが保持されない)ので注意が必要です。

Code:

$array = [
    'd' => 4,
    'c' => 3,
    'a' => 1,
    'e' => 5,
    'b' => 2,
];
sort($array);

Result:

array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}
連想配列の場合は、ソートされた後の値だけが残るので、「連想配列にarray_keysの処理をした後、sortしたい場合」などには使えます。
そんな機会に出くわしたことはないですが。

配列の値を降順ににソート rsort

Code:

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

Result:

array(5) {
  [0]=>
  int(5)
  [1]=>
  int(4)
  [2]=>
  int(3)
  [3]=>
  int(2)
  [4]=>
  int(1)
}
sort関数の逆順
たぶん、reverseの「r」かな?覚えやすいのでそれで覚えてます。

連想配列のキー昇順にソート ksort

Code:

$array = [
    'd' => 4,
    'c' => 3,
    'a' => 1,
    'e' => 5,
    'b' => 2,
];
ksort($array);

Result:

array(5) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
  ["c"]=>
  int(3)
  ["d"]=>
  int(4)
  ["e"]=>
  int(5)
}
連想配列のキー昇順で並べ替えます。
単純配列のソートも可能ですが、そもそも単純配列のキーがバラバラになる状態があまりないので、わざわざ単純配列にksortをする場面は稀だと思います。
ksortの「k」は、キーの「k」。

連想配列のキー降順に krsort

Code:

$array = [
    'd' => 4,
    'c' => 3,
    'a' => 1,
    'e' => 5,
    'b' => 2,
];
krsort($array);

Result:

array(5) {
  ["e"]=>
  int(5)
  ["d"]=>
  int(4)
  ["c"]=>
  int(3)
  ["b"]=>
  int(2)
  ["a"]=>
  int(1)
}
ksortの逆。

配列・連想配列のキーユーザー定義関数でソート uksort

Code:

function fixed_sort($a, $b)
{
    if ($a === 2) return 0;
    if ($b === 2) return 1;

    if ($a === 3) return 0;
    if ($b === 3) return 1;

    if ($a === 1) return 0;
    if ($b === 1) return 1;

    if ($a === 4) return 0;
    if ($b === 4) return 1;

    return $a > $b;
}
$array = [
    3 => 'd',
    2 => 'c',
    0 => 'a',
    4 => 'e',
    1 => 'b',
];
uksort($array, 'fixed_sort');

Result:

array(5) {
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [1]=>
  string(1) "b"
  [4]=>
  string(1) "e"
  [0]=>
  string(1) "a"
}
存在は知っているものの、使わなければならない場面に中々出くわさない。
サンプルは特定の並び順を定義関数内で指定するもの。配列のキーが、関数内の条件分岐、「2,3,1,4,0」の順になる。

連想配列の昇順にソート asort

Code:

$array = [
    'd' => 4,
    'c' => 3,
    'a' => 1,
    'e' => 5,
    'b' => 2,
];
asort($array);

Result:

array(5) {
  ["a"]=>
  int(1)
  ["b"]=>
  int(2)
  ["c"]=>
  int(3)
  ["d"]=>
  int(4)
  ["e"]=>
  int(5)
}
ksortversion。
「a」は(atai)の「a」。たぶん違うと思うけど覚え易いので。

連想配列の降順にソート arsort

Code:

$array = [
    'd' => 4,
    'c' => 3,
    'a' => 1,
    'e' => 5,
    'b' => 2,
];
arsort($array);

Result:

array(5) {
  ["e"]=>
  int(5)
  ["d"]=>
  int(4)
  ["c"]=>
  int(3)
  ["b"]=>
  int(2)
  ["a"]=>
  int(1)
}
asortの逆。

配列の自然順アルゴリズムでソート natsort

Code:

$array = [
    'val 0.4',
    'val 32',
    'val 3',
    'val 15',
    'val -2',
];
arsort($array);

Result:

array(5) {
  [4]=>
  string(6) "val -2"
  [0]=>
  string(7) "val 0.4"
  [2]=>
  string(5) "val 3"
  [3]=>
  string(6) "val 15"
  [1]=>
  string(6) "val 32"
}
サンプルでは文字列付きの数字をソートしています。
asortなどでは、数値を含んだ文字列として認識するので、「-2、0.4、15、3、32」の順番になってしまいます。
数値だけを認識してソートしているわけではないので、数値以前の文字列を変更すると、数値以前の部分でソートした結果となります。

配列・連想配列のユーザー定義関数でソート uasort

Code:

function fixed_sort($a, $b)
{
    if ($a === 'c') return 0;
    if ($b === 'c') return 1;

    if ($a === 'd') return 0;
    if ($b === 'd') return 1;

    if ($a === 'b') return 0;
    if ($b === 'b') return 1;

    if ($a === 'e') return 0;
    if ($b === 'e') return 1;

    return $a > $b;
}
$array = [
    3 => 'd',
    2 => 'c',
    0 => 'a',
    4 => 'e',
    1 => 'b',
];
uasort($array, 'fixed_sort');

Result:

array(5) {
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [1]=>
  string(1) "b"
  [4]=>
  string(1) "e"
  [0]=>
  string(1) "a"
}
uksortversion。

配列・連想配列のをシャッフル shuffle

Code:

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

Result:

// 実行の度に変わるので一例
array(5) {
  [0]=>
  int(3)
  [1]=>
  int(2)
  [2]=>
  int(4)
  [3]=>
  int(1)
  [4]=>
  int(5)
}
規則的なソートではないが、並び変え。
配列のが毎度バラバラに。shuffle(シュッフレ)

サンプル

日付のソート

Code:

$array = [
    '1970-05-05',
    '1970-11-11',
    '1970-03-03',
    '1970-09-09',
    '1970-01-01',
    '1970-07-07',
];
rsort($array);

Result:

array(6) {
  [0]=>
  string(10) "1970-11-11"
  [1]=>
  string(10) "1970-09-09"
  [2]=>
  string(10) "1970-07-07"
  [3]=>
  string(10) "1970-05-05"
  [4]=>
  string(10) "1970-03-03"
  [5]=>
  string(10) "1970-01-01"
}
形式が決まっていれば文字列として日付をソートすることも可能です。
形式が決まっていない場合などは、strtotime()で、timestampにキャストしてからソートしないと、希望通りの結果にならない可能性があるので注意が必要です。

文字列または数値としてソート

ソート関数では、それぞれソートフラグを指定することで、文字列や数値などを指定してソートすることが出来ます。

SORT_REGULAR – 通常通りに項目を比較します。 詳細は比較演算子で説明されています。
SORT_NUMERIC – 数値として項目を比較します。
SORT_STRING – 文字列として項目を比較します。
SORT_LOCALE_STRING – 現在のロケールに基づいて、文字列として項目を比較します。 比較に使うロケールは、setlocale() 関数で変更できます。
SORT_NATURAL – 要素の比較を文字列として行い、 natsort() と同様の「自然順」で比較します。
SORT_FLAG_CASE – SORT_STRINGや SORT_NATURALと (ビットORで) 組み合わせて使い、 文字列のソートで大文字小文字を区別しないようにします。
配列のソート

Code:

$array = [
    '7',
    '300',
    '0.9',
    '1000',
    '50',
];
rsort($array, SORT_NUMERIC);

Result:

array(5) {
  [0]=>
  string(4) "1000"
  [1]=>
  string(3) "300"
  [2]=>
  string(2) "50"
  [3]=>
  string(1) "7"
  [4]=>
  string(3) "0.9"
}
SORT_NUMERICフラグは、数値としてソートします。
値を数字として見て、その大小で比較しています。

Code:

$array = [
    '7',
    '300',
    '0.9',
    '1000',
    '50',
];
rsort($array, SORT_STRING);

Result:

array(5) {
  [0]=>
  string(1) "7"
  [1]=>
  string(2) "50"
  [2]=>
  string(3) "300"
  [3]=>
  string(4) "1000"
  [4]=>
  string(3) "0.9"
}
SORT_STRINGフラグは、文字列としてソートします。
値を文字列として見て、初めの値でソートされています。

値を数値とするか、文字列とするかによって結果が変わってしまうので、数値のソートをする場合などは注意が必要です。

まとめ

ソート系の関数は、数が多いので覚えるのが大変ですが、自分なりのルールを作ると意外と覚えられます。
  • r – reverse(降順)
  • k – key(キーで検索)
  • a – atai(値で検索)
  • u – user定義
  • nat – nature
ソートしないに越したことはありませんが、しなければならない時はどうしてもあると思うので、その時々にあったソート関数を活用ください。