ラボ > PHP:配列関連

PHP 連想配列のソート(array_multisort())

一つのキーでソートしたり、複数のキーでソートしたりしたい。

作成日:2018-06-24, 更新日:2019-07-29

基本

・元の連想配列から、ソートで使いたいキーを添え字にして、値だけの配列を用意
・「array_multisort()」でソートする

// 元の連想配列
$seed = array(
  array( 'id'=>1, 'name'=>'鳥精',           'price'=>'140'),
  array( 'id'=>2, 'name'=>'豚精',           'price'=>'140'),
  array( 'id'=>3, 'name'=>'餅ベーコン',     'price'=>'120'),
  array( 'id'=>4, 'name'=>'丸ごとシマウマ', 'price'=>'160'),
);

// ソートのルール用の配列
$sortKey_name = array();
foreach ($seed as $key=>$value) {
  $sortKey_name[$key] = $value['name'];
}

// ソート
$result = array_multisort( $sortKey_name, SORT_ASC,
                           $seed);

// 結果
if ( $result ) {
  // ソートされた配列
  var_dump($seed);
}
else {
  echo 'ソートに失敗';
}

複数のキーを対象にソート

ソートで使いたい分、用意する

$sortKey_name = array();
$sortKey_price = array();
foreach ($seed as $key=>$value) {
  $sortKey_name[$key]  = $value['name'];
  $sortKey_price[$key] = $value['price'];
}

$result = array_multisort( $sortKey_name,  SORT_ASC,
                           $sortKey_price, SORT_ASC,
                           $seed);

if ( $result ) {
  // ソートされた配列
  var_dump($seed);
}
else {
  echo 'ソートに失敗';
}

オプション

並び替えの順や型の指定はカンマで区切っていく

array_multisort( $sortKey_name,  SORT_ASC, SORT_STRING,
                 $sortKey_price, SORT_ASC, SORT_NUMERIC,
                 $seed);

・SORT_REGULAR - アイテムを通常通り比較します (型を変更しません)。
・SORT_NUMERIC - アイテムを数値として比較します。
・SORT_STRING - アイテムを文字列として比較します。
・SORT_LOCALE_STRING - 現在のロケールを考慮して、アイテムを文字列として比較します。利用するロケールは setlocale() で変更できます。
・SORT_NATURAL - natsort() と同様の「自然順」で、アイテムを文字列として比較します。
・SORT_FLAG_CASE - SORT_STRING や SORT_NATURAL と (ビット OR で) 組み合わせて、 大文字小文字を区別しない文字列のソートを指定します。

関連項目

配列のソートとキーの振り直し(sort()、rsort()、asort()、arsort()、ksort()、krsort()、array_values())