PHPで多次元配列を内部のフィールドの値でソートするには?usort関数の使い方を解説
PHPで多次元配列を、内部の特定のフィールド(キー)の値を基準に並べ替えたい場合は、usort関数を使用します。usortはユーザー定義の比較関数に従って配列をソートするため、どのフィールドを基準に、どの順序で並べるかを自由に制御できるのが特徴です。
サンプルコード:priceキーで昇順にソートする
以下は、連想配列のリストを「price」の値が小さい順に並べ替える例です。
<?php
$my_Array = [
['name' => 'バナナ', 'price' => 100],
['name' => 'りんご', 'price' => 150],
['name' => 'みかん', 'price' => 120],
];
// priceの値を比較するコールバック関数
function compare_array($var_1, $var_2) {
if ($var_1['price'] == $var_2['price']) {
return 0;
}
return ($var_1['price'] < $var_2['price']) ? -1 : 1;
}
usort($my_Array, 'compare_array');
print_r($my_Array);
出力結果
Array
(
[0] => Array
(
[name] => バナナ
[price] => 100
)
[1] => Array
(
[name] => みかん
[price] => 120
)
[2] => Array
(
[name] => りんご
[price] => 150
)
)
解説
usortに渡す比較関数は、2つの要素を受け取り、以下のルールに従って整数値を返す必要があります。
- 第1引数が第2引数より小さい場合 … 負の数(-1)
- 両者が等しい場合 … 0
- 第1引数が第2引数より大きい場合 … 正の数(1)
この戻り値をもとにusortが要素同士を比較し、配列全体を並べ替えます。上の例では「price」が小さい要素ほど前に来る、昇順の並びになります。
PHP 7以降なら宇宙船演算子でより簡潔に書ける
PHP 7で導入された宇宙船演算子(<=>)を使えば、比較処理を1行にまとめられます。
usort($my_Array, function ($a, $b) {
return $a['price'] <=> $b['price'];
});
// PHP 7.4以降ならアロー関数も利用可能
usort($my_Array, fn($a, $b) => $a['price'] <=> $b['price']);
降順にソートしたい場合は、比較の左右を入れ替えるだけでOKです。
return $b['price'] <=> $a['price']; // 降順になる
注意点
- usortは新しい配列を返さず、元の配列そのものを直接並べ替えます(成功時の戻り値はtrue)。
- ソート後は元のキーが失われ、0からの連番に振り直されます。キーを保持したい場合はuasortを使用してください。
-
MongoDBで配列要素の差分を基準にソートする方法【aggregate()活用】
MongoDBで配列内容の差分を使ってソートするには?MongoDBでは、配列内の要素同士の差(差分)を計算し、その結果を基準にドキュメントをソートしたいケースがあります。このような場合は、aggregate()メソッドを使用することで実現できます。本記事では、配列内の2つの値の差を求めて、降順にソートする具体的な手順をサンプルコード付きで解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。ここでは「Scores」という配列フィールドに、2つの「Value」を持つドキュメントを挿入します。> db.demo155.insertOne({"
-
PHPのimagepalettecopy()関数で画像から画像へパレットをコピーする方法
imagepalettecopy() は、PHPに標準で組み込まれている関数の一つで、ある画像から別の画像へカラーパレットをコピーするために使用されます。ソース画像(コピー元)のパレット情報を、デスティネーション画像(コピー先)へそのまま複製できます。 構文 void imagepalettecopy(resource $destination, resource $source) パラメータ imagepalettecopy() は $source と $destination の2つの引数を受け取ります。 $destination − パレットのコピー先となる画像リソースを指定します。