基本的な1次元配列
$array = array(3, 5, 2, 8);
該当するソート関数:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
これらの違いは、キーと値の関連付けが維持されるか( " a
"関数)、低から高または逆( " r
")にソートされるか、値またはキー( " k
")にソートされるか、および値の比較方法のみです。 ( " nat
"対通常)。参照http://php.net/manual/en/array.sorting.phpを概観し、詳細へのリンクについて。
オブジェクトの配列を含む多次元配列
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
$array
各エントリのキー「foo」で並べ替える場合は、カスタム比較関数が必要です。上記のsort
関数と関連する関数は、比較と並べ替えの方法がわかっている単純な値を処理します。PHPは、単純に何をすべきかを「知らない」複雑な値のようなarray('foo' => 'bar', 'baz' => 42)
ものの、だからあなたはそれを伝える必要があります。
そのためには、比較関数を作成する必要があります。この関数は2つの要素を取り0
、これらの要素が等しいと見なされた場合に返す必要があります。0
最初の値が低い場合よりも低い値で0
、最初の値が高い場合よりも高い値です。それだけで十分です。
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
多くの場合、無名関数をコールバックとして使用する必要があります。メソッドまたは静的メソッドを使用する場合は、PHPでコールバックを指定する他の方法を参照してください。
次に、以下のいずれかの関数を使用します。
繰り返しになりますが、キーと値の関連付けを保持し、値またはキーでソートするかどうかだけが異なります。詳細については、ドキュメントを参照してください。
使用例:
usort($array, 'cmp');
usort
配列から2つの項目を取得cmp
し、それらを使用して関数を呼び出します。そのcmp()
ため、$a
as array('foo' => 'bar', 'baz' => 42)
および$b
as で呼び出されarray('foo' => ..., 'baz' => ...)
ます。次に、関数はusort
どちらの値が大きいか、または値が等しいかどうかに戻ります。usort
異なる値を渡し、このプロセス繰り返す$a
と$b
アレイがソートされるまでに。cmp
この関数は、何度も呼び出されます少なくとも内の値があるとして何回も$array
異なるの値の組み合わせで、$a
そして$b
毎回。
このアイデアに慣れるには、次のことを試してください。
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
2つの項目を比較するカスタムの方法を定義するだけで、それで十分です。それはあらゆる種類の値で機能します。
ちなみに、これはどの値でも機能します。値は複雑な配列である必要はありません。実行するカスタム比較がある場合は、数値の単純な配列でも実行できます。
sort
参照で並べ替え、何も返さない!
配列は所定の位置でソートされることに注意してください。戻り値を何かに割り当てる必要はありません。$array = sort($array)
配列をtrue
、並べ替えられた配列ではなく、に置き換えます。sort($array);
うまくいきます。
カスタム数値比較
baz
数値であるキーで並べ替える場合は、次の操作を行うだけです。
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
PoWEr oF MATHのおかげで、これ$a
はより小さいか、等しいか、大きいかによって、<0、0、または> 0の値を返します$b
。
float
値がに減少し、int
精度が失われるため、これは値にはうまく機能しないことに注意してください。代わりに-1
、明示的な0
と1
戻り値を使用してください。
オブジェクト
オブジェクトの配列がある場合、同じように機能します。
function cmp($a, $b) {
return $a->baz - $b->baz;
}
関数
関数の呼び出しを含め、比較関数内で必要なことはすべて実行できます。
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
文字列
最初の文字列比較バージョンのショートカット:
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmp
期待だまさにんcmp
ここで、それを返す-1
、0
または1
。
宇宙船オペレーター
PHP 7では宇宙船演算子が導入されました。これは、型間の比較よりも等しい/小さい/大きいものを統一および簡略化します。
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
複数のフィールドによる並べ替え
主にで並べ替えたいfoo
がfoo
、2つの要素が等しい場合は、baz
次で並べ替えます。
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
よく知っている人にとっては、これはを使用したSQLクエリに相当しますORDER BY foo, baz
。
また、この非常にきちんとした簡略版と、そのような比較関数を任意の数のキーに対して動的に作成する方法も参照してください。
手動の静的な順序へのソート
要素を「foo」、「bar」、「baz」のような「手動の順序」にソートしたい場合:
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
上記すべてについて、PHP 5.3以降を使用している場合(そして本当にそうする必要がある場合)、より短いコードには無名関数を使用し、別のグローバル関数が浮かんでいないようにします。
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
これが、複雑な多次元配列の並べ替えを簡単にする方法です。繰り返しますが、2つのアイテムのどちらが「大きい」かをPHPに教える方法について考えてみてください。PHPに実際のソートを実行させます。
また、上記のすべてについて、昇順と降順を切り替えるには、$a
と$b
引数を入れ替えるだけです。例えば:
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
ある配列を別の配列に基づいてソートする
そして、あるarray_multisort
配列を別の配列に基づいて並べ替えることができる独特ながあります:
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
ここで期待される結果は次のとおりです。
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
array_multisort
そこに着くために使用:
array_multisort($array1, $array2);
PHP 5.5.0以降でarray_column
は、多次元配列から列を抽出し、その列で配列をソートするために使用できます。
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
PHP 7.0.0以降、オブジェクトの配列からプロパティを抽出することもできます。
より一般的なケースがある場合は、この回答を自由に編集してください。