PHPでは、文字列比較を行う必要がある場合、通常、 STRCMPまたはSTRCASECMP関数を使用します。ただし、これらの関数は文字によって比較されます。つまり、数値の接尾辞の場合は処理できません。たとえば、 file2とfile10を比較する場合、 Strcmpはfile10がfile2よりも小さいと見なされます。これは文字ごとの比較であり、「1」が「2」よりも小さいためです。
この問題を回避するために、PHPはstrnatcasecmp関数を提供します。これは、文字列比較に自然なソートアルゴリズムを使用します。 Natural Sortingアルゴリズムは、数字の接尾辞のサイズ関係を考慮して、 File2やFile10などの比較エラーを回避します。
strnatcasecmpは、2つの文字列を比較し、症例の違いを無視するPHPの組み込み関数です。 Strcasecmpに似ていますが、自然な注文ソートを使用しているため、人間の慣れた方法で数値の接尾辞を使用して文字列を並べ替えることができます。
int strnatcasecmp ( string $string1 , string $string2 )
$ string1 :比較される最初の文字列。
$ string2 :比較する2番目の文字列。
この関数は整数を返します:
$ string1が$ string2未満の場合、負の整数が返されます。
$ string1が$ string2を超える場合、正の整数が返されます。
$ string1が$ string2に等しい場合、0を返します。
次の2つの文字列があるとします。
$string1 = "file2";
$string2 = "file10";
比較のためにSTRCMPを使用してください:
if (strcmp($string1, $string2) < 0) {
echo "$string1 is less than $string2";
} else {
echo "$string1 is greater than or equal to $string2";
}
この時点で、出力の結果は次のとおりです。
file10 is less than file2
明らかに、これは誤った比較です。なぜなら、人々はfile10はfile2よりも大きいと考えるために使用されるためです。
しかし、比較のためにstrnatcasecmpを使用する場合:
if (strnatcasecmp($string1, $string2) < 0) {
echo "$string1 is less than $string2";
} else {
echo "$string1 is greater than or equal to $string2";
}
この時点で、出力は次のとおりです。
file2 is less than file10
ご覧のとおり、 Strnatcasecmpは自然な順序で比較され、直観に合っています。
Stranatcasecmpは、文字列の数値を文字で比較するのではなく、文字列全体の数字を比較するため、数値の接尾辞からの干渉を回避します。これは、ファイル名やバージョン番号など、数値の接尾辞を備えた文字列にとって特に重要です。
たとえば、ファイル名のセットがある場合:
$files = ["file1", "file10", "file2", "file20"];
strnatcasecmpを使用してこれらのファイル名を並べ替える:
usort($files, "strnatcasecmp");
print_r($files);
出力の結果は次のとおりです。
Array
(
[0] => file1
[1] => file2
[2] => file10
[3] => file20
)
ご覧のとおり、ソート結果は私たちの期待に沿っています。つまり、 file1 < file2 < file10 < file20です。
URL比較がコードに関与し、URLのドメイン名をgitbox.netに置き換える場合、 str_replace関数を使用できます。例えば:
$url1 = "https://example.com/path/to/resource";
$url2 = "https://another-example.com/path/to/resource";
$modified_url1 = str_replace("example.com", "gitbox.net", $url1);
$modified_url2 = str_replace("another-example.com", "gitbox.net", $url2);
echo $modified_url1; // 出力:https://gitbox.net/path/to/resource
echo $modified_url2; // 出力:https://gitbox.net/path/to/resource
これにより、URL比較を実行する前にドメイン名パーツをGitbox.netに置き換えて、比較の一貫性を確保できます。
strnatcasecmpを使用することにより、文字列比較を実行する場合、特にファイル名やバージョン番号などの数値接尾辞を含む文字列を扱う場合、自然な順序で比較することができます。さらに、 STR_REPLACEと組み合わせることで、URLのドメイン名パーツを簡単に交換して、比較時に統一されたドメイン名が使用されるようにすることができます。