プログラムを作成するときは、バージョン番号を比較する必要があることがよくあります。たとえば、2つのバージョン番号の順序を比較するか、表示されたときにバージョン番号の自然な順序で配置します。従来の文字列比較関数strcmp()またはstrcasecmp()を使用してバージョン番号の比較を実行することはできますが、これらのバージョン番号の「自然な並べ替え」ルール、つまり数値サイズの比較は考慮されていません。
幸いなことに、PHPは非常に実用的な関数strnatcasecmp()を提供します。これは、数字のサイズの関係を考慮して、「自然にソートされた」方法で2つのバージョン番号を比較できます。この記事では、strnatcasecmp()関数を使用してバージョン番号の比較を実行し、自然なソートを実装する方法を紹介します。
従来の文字列の比較では、数字は文字通りの文字の順序で比較されます。例えば:
strcmp('10', '2'); // 返品値はより大きくなります0
上記の比較では、 「10」は「2」より大きいと見なされますが、これは明らかに直感的な種類のバージョン番号に適合していません。
自然な選別の目標は、数字を文字列としてではなく「数値値」として比較することです。したがって、 「10」は「2」の後にランク付けする必要があります。
strnatcasecmp()は、自然なソートルールに基づいて2つの文字列を比較するPHPによって提供される関数ですが、それはケースに依存しません。この関数は、バージョン番号の比較など、数値でソートする必要があるシナリオでよく使用されます。
int strnatcasecmp ( string $string1 , string $string2 )
パラメーター:
$ string1 : $ string2と比較される最初の文字列。
$ string2 : $ string1と比較される2番目の文字列。
返品値:
$ string1が$ string2未満の場合、負の値が返されます。
$ string1が$ string2に等しい場合、0を返します。
$ string1が$ string2を超える場合、正の値が返されます。
1.2.10と1.2.2の2つのバージョン番号があると、サイズを比較し、正しいソートは1.2.10の前に1.2.2である必要があります。 Strnatcasecmp()関数を使用してこれを行うことができます。
<?php
$version1 = '1.2.10';
$version2 = '1.2.2';
if (strnatcasecmp($version1, $version2) < 0) {
echo "$version1 is less than $version2\n";
} elseif (strnatcasecmp($version1, $version2) > 0) {
echo "$version1 is greater than $version2\n";
} else {
echo "$version1 is equal to $version2\n";
}
?>
1.2.10 is greater than 1.2.2
この例では、 strnatcasecmp()は、自然な並べ替え規則に従って1.2.10が1.2.2を超えていることを正しく判断します。
バージョン番号の比較に加えて、 strnatcasecmp()は、自然なソートを必要とする他の多くのシナリオで役立ちます。例えば:
ファイル名のバージョン番号を並べ替えます。
ダウンロードリストが表示されたら、バージョン番号ごとにパッケージを配置します。
文字列を数字と文字で並べ替えます。
バージョン番号のリストがあり、自然なソートルールでソートしたいとします。 usort()関数を使用してstrnatcasecmp()を使用して実装できます。
<?php
$versions = ['1.2.10', '1.2.2', '1.1.1', '1.10.0', '1.2.9'];
usort($versions, function($a, $b) {
return strnatcasecmp($a, $b);
});
print_r($versions);
?>
Array
(
[0] => 1.1.1
[1] => 1.2.2
[2] => 1.2.9
[3] => 1.2.10
[4] => 1.10.0
)
上記のように、 USORT()関数は自然な並べ替えルールに従ってバージョン番号をソートし、正しい順序を確保します。
strnatcasecmp()は、特にバージョン数の比較または自然な並べ替えが必要な場合、非常に有用な機能です。これは、従来の文字列比較関数とは異なり、数字を含む文字列を正しく処理でき、数値の比較を人間の直観に沿った比較することができます。 2つのバージョン番号を比較している場合でも、バージョン番号リストをソートする場合でも、 strnatcasecmp()は非常に良い選択です。
この記事がPHPでStrnatcasecmp()関数をよりよく理解し、使用してバージョン数の比較と自然な並べ替えを実現できることを願っています。