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)を返します。破壊的関数ではなく、戻り値としてソートされた配列を返してくれればいいのに、と常々思うところではあります。
破壊的関数なので、引数として渡した配列の順番が変わります。
戻り値は常にboolean(true)を返します。破壊的関数ではなく、戻り値としてソートされた配列を返してくれればいいのに、と常々思うところではあります。
使い方
配列の値を昇順ににソート 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と同様に、連想配列を渡した場合には配列へとキャストされてしまう(キーが保持されない)ので注意が必要です。
後述の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」かな?覚えやすいのでそれで覚えてます。
たぶん、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」。
単純配列のソートも可能ですが、そもそも単純配列のキーがバラバラになる状態があまりないので、わざわざ単純配列に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」の順になる。
サンプルは特定の並び順を定義関数内で指定するもの。配列のキーが、関数内の条件分岐、「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)
}
ksortの値version。
「a」は値(atai)の「a」。たぶん違うと思うけど覚え易いので。
「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」の順番になってしまいます。
数値だけを認識してソートしているわけではないので、数値以前の文字列を変更すると、数値以前の部分でソートした結果となります。
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"
}
uksortの値version。
配列・連想配列の値をシャッフル 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(シュッフレ)
配列の値が毎度バラバラに。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にキャストしてからソートしないと、希望通りの結果にならない可能性があるので注意が必要です。
形式が決まっていない場合などは、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