配列をソートするPHPの関数

PHPには、配列の要素やキーをソートするための関数が色々と定義されています。数値や文字列の昇順、降順はもちろん、自然順アルゴリズムでのソートや多次元配列をソートする関数まで用意されています。これらの関数を使うことで、簡単に配列をソートすることができます。

配列の要素を昇順にソートする sort()

sort()は、第1引数で渡された配列の要素を昇順にソートします。第2引数では、並び替える際の値の比較方法を定数で指定します。第2引数は省略可能ですが、デフォルト値のSORT_REGULARでは数値形式の文字列同士を数値として比較してしまうため、同じ要素を持つ配列でも要素の順番によって結果が異なってきます。なので、数値として比較したい場合はSORT_NUMERIC、文字列として比較したい場合はSORT_STRINGと明示的に指定した方が良いでしょう。

戻り値は、並び替えに成功した場合はtrue、失敗した場合はfalseとなります。並び替え後の配列のキーは、連想配列のキーも含めて0から順に振り直されます。

PHP

<?php
$array = array(3, 'foo' => 2, 1);
$result = sort($array, SORT_NUMERIC);
var_dump($result);
var_dump($array);
/* 出力:
bool(true)
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
*/
?>

配列の要素を降順にソートする rsort()

rsort()は、第1引数で渡された配列の要素を降順にソートします。第2引数、戻り値、並び替え後の配列のキーに関しては、sort()と同様です。

PHP

<?php
$array = array('b', 'foo' => 'a', 'c');
$result = rsort($array, SORT_STRING);
var_dump($result);
var_dump($array);
/* 出力:
bool(true)
array(3) {
  [0]=>
  string(1) "c"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "a"
}
*/
?>

キーと値のペアを維持しつつ配列の要素を昇順にソートする asort()

asort()は、第1引数で渡された配列の要素を昇順にソートします。第2引数や戻り値に関してはsort()と同様ですが、sort()がキーを0から順に振り直すのに対して、asort()では並び替えた後もキーと値のペアは維持されます。

PHP

<?php
$array = array('yellow' => 'banana', 'green' => 'melon', 'red' => 'apple');
$result = asort($array, SORT_STRING);
var_dump($result);
var_dump($array);
/* 出力:
bool(true)
array(3) {
  ["red"]=>
  string(5) "apple"
  ["yellow"]=>
  string(6) "banana"
  ["green"]=>
  string(5) "melon"
}
*/
?>

キーと値のペアを維持しつつ配列の要素を降順にソートする arsort()

arsort()は、第1引数で渡された配列の要素を降順にソートします。第2引数、戻り値、並び替え後のキーに関しては、asort()と同様です。

PHP

<?php
$array = array('yellow' => 'banana', 'green' => 'melon', 'red' => 'apple');
$result = arsort($array, SORT_STRING);
var_dump($result);
var_dump($array);
/* 出力:
bool(true)
array(3) {
  ["green"]=>
  string(5) "melon"
  ["yellow"]=>
  string(6) "banana"
  ["red"]=>
  string(5) "apple"
}
*/
?>

配列のキーを昇順にソートする ksort()

ksort()は、第1引数で渡された配列のキーを昇順にソートします。第2引数や戻り値に関しては、sort()と同様です。配列を並び替えた後でも、キーと値のペアは維持されます。

PHP

<?php
$array = array('c' => 2, 'a' => 3, 'b' => 1);
$result = ksort($array, SORT_STRING);
var_dump($result);
var_dump($array);
/* 出力:
bool(true)
array(3) {
  ["a"]=>
  int(3)
  ["b"]=>
  int(1)
  ["c"]=>
  int(2)
}
*/
?>

配列のキーを降順にソートする krsort()

krsort()は、第1引数で渡された配列のキーを降順にソートします。第2引数、戻り値、並び替え後のキーと値の対応に関しては、ksort()と同様です。

PHP

<?php
$array = array('c' => 2, 'a' => 3, 'b' => 1);
$result = krsort($array, SORT_STRING);
var_dump($result);
var_dump($array);
/* 出力:
bool(true)
array(3) {
  ["c"]=>
  int(2)
  ["b"]=>
  int(1)
  ["a"]=>
  int(3)
}
*/
?>

配列の要素をユーザー定義の比較関数でソートする usort()

usort()は、第1引数で渡した配列の要素をユーザー定義の比較関数を用いてソートします。戻り値や並び替え後の配列のキーに関しては、sort()と同様です。usort()では、第2引数で比較関数をコールバック関数として指定します。比較関数は引数を2つ受け取り、第1引数が第2引数より小さい場合に-1、等しい場合に0、大きい場合に1を返すように定義します。

PHP

<?php
function compare($a, $b)
{
  if ($a == $b) {
    return 0;
  }
  return ($a < $b) ? -1 : 1;
}
$array = array(2, 3, 'foo' => 1);
$result = usort($array, 'compare');
var_dump($result);
var_dump($array);
/* 出力:
bool(true)
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
*/
?>

キーと値のペアを維持しつつ配列の要素をユーザー定義の比較関数でソートする uasort()

uasort()は、第1引数で渡した配列の要素をユーザー定義の比較関数を用いてソートします。第2引数や戻り値に関してはusort()と同様ですが、usort()がキーを0から順に振り直すのに対して、uasort()では並び替えた後もキーと値のペアは維持されます。

PHP

<?php
function compare($a, $b)
{
  if ($a == $b) {
    return 0;
  }
  return ($a < $b) ? -1 : 1;
}
$compare = 'compare';
$array = array(3, 2, 'foo' => 1);
$result = uasort($array, $compare);
var_dump($result);
var_dump($array);
/* 出力:
bool(true)
array(3) {
  ["foo"]=>
  int(1)
  [1]=>
  int(2)
  [0]=>
  int(3)
}
*/
?>

配列のキーをユーザー定義の比較関数でソートする uksort()

uksort()は、第1引数で渡した配列のキーをユーザー定義の比較関数を用いてソートします。usort()と同じように第2引数でコールバック関数を指定します。戻り値や並び替え後のキーと値の対応に関しては、ksort()と同様です。

PHP

<?php
$compare = function($a, $b)
{
  return strcasecmp($a, $b);
};
$array = array('b' => 0, 'a' => 2, 'c' => 1);
$result = uksort($array, $compare);
var_dump($result);
var_dump($array);
/* 出力:
bool(true)
array(3) {
  ["a"]=>
  int(2)
  ["b"]=>
  int(0)
  ["c"]=>
  int(1)
}
*/
?>

自然順アルゴリズムで配列の要素をソートする natsort()

natsort()は、引数で渡された配列の要素を自然順と呼ばれるアルゴリズムでソートします。戻り値や並び替え後のキーに関しては、asort()と同様です。自然順アルゴリズムに関しては、下記例のようにasort()との違いを見るとわかりやすいでしょう。natsort()では、文字列内の数値部分を数値として比較するため、連番のファイル名などを人間的な解釈でソートできます。

PHP

<?php
$array = array('img_2.jpg', 'img_12.jpg', 'img_1.jpg');
asort($array);
print_r($array);
$result = natsort($array);
var_dump($result);
print_r($array);
/* 出力:
Array
(
  [2] => img_1.jpg
  [1] => img_12.jpg
  [0] => img_2.jpg
)
bool(true)
Array
(
  [2] => img_1.jpg
  [0] => img_2.jpg
  [1] => img_12.jpg
)
*/
?>

大文字小文字を区別しない自然順アルゴリズムで配列の要素をソートする natcasesort()

natcasesort()は、引数で渡された配列の要素を大文字小文字を区別せずに自然順アルゴリズムでソートします。大文字小文字を区別しない点以外は、natsort()と同様です。

PHP

<?php
$array = array('img_2.jpg', 'IMG_12.jpg', 'img_1.jpg');
natsort($array);
print_r($array);
$result = natcasesort($array);
var_dump($result);
print_r($array);
/* 出力:
Array
(
  [1] => IMG_12.jpg
  [2] => img_1.jpg
  [0] => img_2.jpg
)
bool(true)
Array
(
  [2] => img_1.jpg
  [0] => img_2.jpg
  [1] => IMG_12.jpg
)
*/
?>

複数の配列や多次元配列をソートする array_multisort()

array_multisort()を使うと複数の配列や多次元配列もソートすることができます。下記の例では、array_multisort()の引数で複数の配列を渡していますが、第1引数で渡した配列のソート結果を元に第2引数の配列もソートされていることがわかります。配列のキーに関しては、連想配列のキーは維持されますが、添字の数値は0から順に振り直されます。戻り値に関してはsort()と同様です。

PHP

<?php
$array1 = array(3, 1, 'foo' => 2);
$array2 = array('a', 'hoge' => 'b', 'c');
$result = array_multisort($array1, $array2);
var_dump($result);
print_r($array1);
print_r($array2);
/* 出力:
bool(true)
Array
(
  [0] => 1
  [foo] => 2
  [1] => 3
)
Array
(
  [hoge] => b
  [0] => c
  [1] => a
)
*/
?>

array_multisort()では、多次元配列もソートすることができます。下記の例では、多次元配列を’price’のSORT_DESC, SORT_NUMERIC(数値の降順)でソートしますが、’price’の値が同じ場合は、’name’のSORT_ASC, SORT_STRING(文字列の昇順)でソートするようにしています。

PHP

<?php
$cs = array();
$cs[] = array('name' => 'Illustrator', 'price' => 850);
$cs[] = array('name' => 'Photoshop', 'price' => 1000);
$cs[] = array('name' => 'Flash', 'price' => 850);
foreach($cs as $key => $value) {
  $name[$key] = $value['name'];
  $price[$key] = $value['price'];
}
array_multisort($price, SORT_DESC, SORT_NUMERIC, $name, SORT_ASC, SORT_STRING, $cs);
print_r($price);
print_r($name);
print_r($cs);
/* 出力:
Array
(
  [0] => 1000
  [1] => 850
  [2] => 850
)
Array
(
  [0] => Photoshop
  [1] => Flash
  [2] => Illustrator
)
Array
(
  [0] => Array
    (
      [name] => Photoshop
      [price] => 1000
    )

  [1] => Array
    (
      [name] => Flash
      [price] => 850
    )

  [2] => Array
    (
      [name] => Illustrator
      [price] => 850
    )

)
*/
?>

配列の要素を逆順に並び替えた配列を返す array_reverse()

array_reverse()は、第1引数で渡された配列の要素を逆順に並び替えた新しい配列を返します。第2引数では、キーを維持するかをBool値で指定します。第2引数を省略、またはfalseを指定した場合、連想配列のキーは維持されますが、数値の添字は0から順に振り直されます。

PHP

<?php
$array = array(1, 'foo' => 2, 3);
$result1 = array_reverse($array);
$result2 = array_reverse($array, true);
print_r($result1);
print_r($result2);
/* 出力:
Array
(
  [0] => 3
  [foo] => 2
  [1] => 1
)
Array
(
  [1] => 3
  [foo] => 2
  [0] => 1
)
*/
?>

配列の要素をランダムに並び替える shuffle()

shuffle()は、引数で渡された配列の要素をランダムに並び替えます。並び替え後の配列のキーは、連想配列のキーも含めて0から順に振り直されます。戻り値に関してはsort()と同様です。

PHP

<?php
$array = array(1, 'foo' => 2, 3, 'hoge' => 4);
$result = shuffle($array);
var_dump($result);
print_r($array);
/* 出力:(要素の値はランダムです。)
bool(true)
Array
(
  [0] => 3
  [1] => 1
  [2] => 2
  [3] => 4
)
*/
?>