PHP入門:usortの使い方

スポンサーリンク
PHP入門:usortの使い方 ノウハウ
PHP入門:usortの使い方
この記事は約6分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、PHPのusort関数についてご紹介します。

スポンサーリンク

背景

とある業務で PHP の usort関数を使用する場面がありましたので、そのご紹介をします。

下記のセクションで構成されています。

  1. コード用のフォルダを作成する。
  2. usort関数を利用したコードを追加します。

リファレンス

公式サイトによる関数リファレンスは下記になります。

フォルダ作成

コード用のフォルダを作成する

最初に作業ディレクトリを作成します。手順は下記のコマンドになります。

mkdir 17_learn-php-usort
cd 17_learn-php-usort

PHPのバージョンを設定

asdfコマンドで使用するPHPのバージョンを指定します。すでにPHPが実行できる状態にある方は、このコマンドをスキップしても問題ありません。

asdf local php 8.2.7

asdfコマンドでPHPをインストールする方法については下記のページを参照ください。

usort関数を使用したコード

usort関数とは

usort関数は、PHPの組み込み関数の一つで、配列をソートするために使用されます。usort関数は、ユーザーが定義した比較関数を使用して配列の要素をソートします。

以下は、usort関数の基本的な構文です。

usort(array &$array, callable $comparison_function): bool
  • $array: ソートする配列への参照。
  • $comparison_function: ユーザーが定義した比較関数。

usort()関数は、ソート前の配列を直接変更します。ソート後の配列は、$array引数に変更が加えられることに注意してください。

ユーザーが定義する比較関数は、2つの要素を受け取り、それらの大小関係を示す値を返す必要があります。比較関数は、以下のような形式を持つ必要があります。

function comparison_function($a, $b): int {
    // $a と $b を比較し、その結果を返す
}

比較関数が返す値の意味は次のとおりです。

  • 負の整数: $a$bよりも小さいと判断される。($a < $b)
  • 0: $a$bは等しいと判断される。($a = $b)
  • 正の整数: $a$bよりも大きいと判断される。($a > $b)

サンプル1

以下は、usort()関数の使用例です。配列内の数値を昇順にソートします。

$numbers = [4, 2, 1, 3];

usort($numbers, function($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
});

print_r($numbers);

この例では、無名関数(クロージャ)を使用して比較関数を定義しています。比較関数は、数値の大小を比較し、結果を返します。usort()関数はこの比較関数を使用して配列をソートし、print_r()関数を使用してソート後の配列を表示します。

01.phpというファイル名で保存して、実行した場合場合、出力は次のようになります。

% php 01.php   
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

サンプル2

順序を別で定義されている場合は、下記のようにして実現することもできます。

$order = ['A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5];

$goods = ['E', 'B', 'D', 'C', 'A'];

usort($goods, function($a, $b) use($order) {
    $oa = $order[$a];
    $ob = $order[$b];
    if ($oa == $ob) {
        return 0;
    }
    return ($oa < $ob) ? -1 : 1;
});

print_r($goods);

このコードは、指定された順序に基づいて配列をソートする例です。以下にコードの解説を示します。

  1. $orderという連想配列が定義されています。この配列は、要素とそれに対応する順序のマッピングを持ちます。例えば、'A' => 1は要素’A’の順序が1であることを示しています。
  2. $goodsという配列が定義されています。これはソート対象の配列です。要素は順序に従ってソートされます。
  3. usort()関数が使用されています。この関数は、$goods配列をソートします。ソートには、後述する無名関数(クロージャ)が使用されます。
  4. 無名関数(クロージャ)が定義されています。この関数は、$a$bという2つの要素を受け取り、それらの順序を比較します。use($order)という行は、無名関数が外部の$order変数にアクセスできるようにするためのものです。
  5. $oa$obという変数が定義されています。それぞれ$a$bの順序を$order配列から取得します。つまり、$oaは要素$aの順序であり、$obは要素$bの順序です。
  6. if ($oa == $ob)という条件文があります。これは、要素$aと要素$bの順序が同じである場合をチェックしています。
  7. 条件文の中では、return 0が行われています。これは、要素$aと要素$bの順序が等しいことを示すため、ソートの順序を変更しません。
  8. もし要素$aの順序が要素$bの順序よりも小さい場合、return ($oa < $ob) ? -1 : 1が実行されます。これにより、要素$aが要素$bよりも小さいことを示し、ソート順序が変更されます。
  9. print_r($goods)が呼び出されて、ソート後の配列$goodsが表示されます。

このコードの目的は、$order配列に基づいて$goods配列をソートすることです。$order配列は各要素の順序を指定し、usort()関数の無名関数(クロージャ)を使用して要素の比較とソートを行います。最終的に、$goods配列は指定された順序に従ってソートされた状態で表示されます。

02.phpというファイル名で保存して、実行した場合場合、出力は次のようになります。

% php 02.php      
Array
(
    [0] => A
    [1] => B
    [2] => C
    [3] => D
    [4] => E
)

おわりに

今日は、PHPのusortについてご紹介しました。

usortの比較関数の戻り値の正負に毎回しらべているので、これを気に文章に残してみました。

大事なので、再掲しておきます。

比較関数が返す値の意味は次のとおりです。

  • 負の整数: $a$bよりも小さいと判断される。($a < $b)
  • 0: $a$bは等しいと判断される。($a = $b)
  • 正の整数: $a$bよりも大きいと判断される。($a > $b)
よっしー
よっしー

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました