関数・クラス解説
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 で) 組み合わせて、 大文字小文字を区別しない文字列のソートを指定します。
- 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
)
参考
ワード検索
※入力キーワードが、関数名・説明文・タグに含まれるものを検索関数名アルファベット別
最終更新一覧
●stristr
大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却
●stripslashes
バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く
●stripos
大文字小文字を区別せずに文字列が最初に現れる位置を取得する
●stripcslashes
addcslashes() でクォートされた文字列をアンクォートする
●strip_tags
文字列から HTML と PHP のタグを除去して返却
●strcspn
指定した文字が最初に現れる位置を調べる
●strcoll
ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する
●strcmp
2つの文字列を比較し同じか(あるいは大小)を判定する
●strchr
strstr() のエイリアス
●strcasecmp
2つの文字列を比較(大文字小文字を区別せず同じとみなす)
カテゴリー一覧
PHP の振る舞いの変更
音声フォーマットの操作
認証サービス
コマンドライン関連
圧縮およびアーカイブ
暗号
データベース関連
日付および時刻関連
ファイルシステム
自然言語および文字エンコーディング
画像処理および作成
メール関連
数学
テキスト以外の MIME 型
プロセス制御
その他の基本モジュール
その他のサービス
検索エンジン用の拡張モジュール
サーバー固有のモジュール
セッション関連
テキスト処理
変数・データ型関連
ウェブサービス
Windows 用のモジュール
XML 操作
GUI用の拡張モジュール