PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

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を使用してください。
  1. MongoDBで配列要素の差分を基準にソートする方法【aggregate()活用】

    MongoDBで配列内容の差分を使ってソートするには?MongoDBでは、配列内の要素同士の差(差分)を計算し、その結果を基準にドキュメントをソートしたいケースがあります。このような場合は、aggregate()メソッドを使用することで実現できます。本記事では、配列内の2つの値の差を求めて、降順にソートする具体的な手順をサンプルコード付きで解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。ここでは「Scores」という配列フィールドに、2つの「Value」を持つドキュメントを挿入します。> db.demo155.insertOne({"

  2. PHPのimagepalettecopy()関数で画像から画像へパレットをコピーする方法

    imagepalettecopy() は、PHPに標準で組み込まれている関数の一つで、ある画像から別の画像へカラーパレットをコピーするために使用されます。ソース画像(コピー元)のパレット情報を、デスティネーション画像(コピー先)へそのまま複製できます。 構文 void imagepalettecopy(resource $destination, resource $source) パラメータ imagepalettecopy() は $source と $destination の2つの引数を受け取ります。 $destination − パレットのコピー先となる画像リソースを指定します。