こんにちは。よっしーです(^^)
今日は、PHPのusort関数についてご紹介します。
背景
とある業務で PHP の usort関数を使用する場面がありましたので、そのご紹介をします。
下記のセクションで構成されています。
- コード用のフォルダを作成する。
- 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);
このコードは、指定された順序に基づいて配列をソートする例です。以下にコードの解説を示します。
$order
という連想配列が定義されています。この配列は、要素とそれに対応する順序のマッピングを持ちます。例えば、'A' => 1
は要素’A’の順序が1であることを示しています。$goods
という配列が定義されています。これはソート対象の配列です。要素は順序に従ってソートされます。usort()
関数が使用されています。この関数は、$goods
配列をソートします。ソートには、後述する無名関数(クロージャ)が使用されます。- 無名関数(クロージャ)が定義されています。この関数は、
$a
と$b
という2つの要素を受け取り、それらの順序を比較します。use($order)
という行は、無名関数が外部の$order
変数にアクセスできるようにするためのものです。 $oa
と$ob
という変数が定義されています。それぞれ$a
と$b
の順序を$order
配列から取得します。つまり、$oa
は要素$a
の順序であり、$ob
は要素$b
の順序です。if ($oa == $ob)
という条件文があります。これは、要素$a
と要素$b
の順序が同じである場合をチェックしています。- 条件文の中では、
return 0
が行われています。これは、要素$a
と要素$b
の順序が等しいことを示すため、ソートの順序を変更しません。 - もし要素
$a
の順序が要素$b
の順序よりも小さい場合、return ($oa < $ob) ? -1 : 1
が実行されます。これにより、要素$a
が要素$b
よりも小さいことを示し、ソート順序が変更されます。 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)
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント