関数・クラス解説

array_multisort

version:PHP 4, PHP 5, PHP 7 (公式)

複数または多次元の配列をソートする

公式リファレンス

書式

array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR ]], mixed ...$rest ) : bool

説明

array_multisort() は、複数の配列を一度に、 または、多次元の配列をその次元の一つでソートする際に使用可能です。

連想配列のキー (string) は不変ですが、 数値添字は再度振り直されます。

注意:

比較結果が等しくなる二つの要素があった場合、ソートした配列におけるそれらの並び順は不定となります。

パラメータ

array1
ソートしたい配列。
array1_sort_order
先ほどの引数 array のソート順。 SORT_ASC はアイテムを昇順にソートし、 SORT_DESC はアイテムを降順にソートします。 この引数は、array1_sort_flags と入れ替えることもできるし、完全に省略することもできます。 省略した場合は SORT_ASC とみなします。
array1_sort_flags
先ほどの引数 array のソート方法。 これらのフラグが使えます。
  • SORT_REGULAR - アイテムを通常通り比較します (型を変更しません)。
  • SORT_NUMERIC - アイテムを数値として比較します。
  • SORT_STRING - アイテムを文字列として比較します。
  • SORT_LOCALE_STRING - 現在のロケールを考慮して、アイテムを文字列として比較します。利用するロケールは setlocale() で変更できます。
  • SORT_NATURAL - natsort() と同様の「自然順」で、アイテムを文字列として比較します。
  • SORT_FLAG_CASE - SORT_STRING や SORT_NATURAL と (ビット OR で) 組み合わせて、 大文字小文字を区別しない文字列のソートを指定します。
この引数は、array1_sort_order と入れ替えることもできるし、完全に省略することもできます。 省略した場合は SORT_REGULAR とみなします。
rest
追加の配列。オプションで並び順やフラグが続きます。 前の配列の比較結果が等しい要素に対応する要素群だけを比較します。 要するに、辞書的 (lexicographical) なソートを行うということです。

返値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

サンプル

例1 複数の配列をソートする

$ar1 = array(10, 100, 100, 0); $ar2 = array(1, 3, 2, 4); array_multisort($ar1, $ar2); var_dump($ar1); var_dump($ar2);

この例では、ソートの後で、最初の配列は、0, 10, 100, 100 となります。 2番目の配列は、4, 1, 2, 3 を有します。最初の配列で等しい要素 (100 および 100) に対応している二番目の配列のエントリは、 同じ順にソートされます。

array(4) { [0]=> int(0) [1]=> int(10) [2]=> int(100) [3]=> int(100) } array(4) { [0]=> int(4) [1]=> int(1) [2]=> int(2) [3]=> int(3) }

例2 多次元の配列をソートする

$ar = array(        array("10", 11, 100, 100, "a"),        array(   1,  2, "2",   3,   1)       ); array_multisort($ar[0], SORT_ASC, SORT_STRING,                 $ar[1], SORT_NUMERIC, SORT_DESC); var_dump($ar);

この例では、ソートされた後、最初の配列は "10", 100, 100, 11, "a" (文字列として昇順でソートされています) に変換され、二番目の配列は、 1, 3, "2", 2, 1 (数値として降順にソートされています) となっています。

array(2) { [0]=> array(5) { [0]=> string(2) "10" [1]=> int(100) [2]=> int(100) [3]=> int(11) [4]=> string(1) "a" } [1]=> array(5) { [0]=> int(1) [1]=> int(3) [2]=> string(1) "2" [3]=> int(2) [4]=> int(1) } }

例3 データベースの結果をソートする

この例では、配列 data の個々の要素がテーブルのひとつの行を表しています。 これは、データベースのレコードの典型的な形式です。

データの例:

volume | edition -------+-------- 67 | 2 86 | 1 85 | 6 98 | 2 86 | 6 67 | 7

データは data という名前の配列に格納します。 これは、例えば mysql_fetch_assoc() の結果をループさせたりすれば得られます。

$data[] = array('volume' => 67, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 1); $data[] = array('volume' => 85, 'edition' => 6); $data[] = array('volume' => 98, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 6); $data[] = array('volume' => 67, 'edition' => 7);

この例では、データを volume の降順、 edition の昇順に並べ替えます。

私たちが今もっているのは行方向の配列ですが、 array_multisort() で必要なのは列方向の配列です。 そこで、以下のコードで列方向の配列を得たあとでソートを行います。

// 列方向の配列を得る foreach ($data as $key => $row) {     $volume[$key]  = $row['volume'];     $edition[$key] = $row['edition']; } // PHP 5.5.0 以降では、上記のコードの代わりに array_column() を使用できます $volume  = array_column($data, 'volume'); $edition = array_column($data, 'edition'); // データを volume の降順、edition の昇順にソートする。 // $data を最後のパラメータとして渡し、同じキーでソートする。 array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

データセットの行はソートされ、以下のようになります:

volume | edition -------+-------- 98 | 2 86 | 1 86 | 6 85 | 6 67 | 2 67 | 7

例4 大文字・小文字を区別しないソート

SORT_STRING と SORT_REGULAR はどちらも大文字・小文字を区別し、 大文字ではじまる文字列が小文字で始まる文字列より前になります。

大文字・小文字を区別しないためには、 元の配列の内容をすべて小文字に変換した配列を用意し、 それをソートの基準にします。

$array = array('Alpha', 'atomic', 'Beta', 'bank'); $array_lowercase = array_map('strtolower', $array); array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array); print_r($array);

上の例の出力は以下となります。

Array ( [0] => Alpha [1] => atomic [2] => bank [3] => Beta )

参考

  • usort() - ユーザー定義の比較関数を使用して、配列を値でソートする
  • 配列ソート関数の比較
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール