PHP開発では、文字列比較は最も一般的な操作の1つです。特に、ユーザーの入力、ファイル名の並べ替え、または検索機能の実装を扱う場合、文字列を異なる上限と低いケース、特に国際文字を含む文字列と正しく比較する方法は、無視できない問題です。 strnatcasecmp関数は、この自然な順序であるケースに依存しない文字列比較に特化したツールです。
strnatcasecmpは、2つの文字列を比較するためにPHPによって提供される組み込み関数です。その比較方法は「自然な順序」であり、症例ではないものです。これは、たとえば、人間の習慣的に理解している順序で比較できることを意味します。
echo strnatcasecmp("image1.jpg", "Image10.jpg");
上記のコードは負の数を返します。これは、「1」が「10」の前にあるため、 image1.jpgがimage10.jpgよりも少ないことを示します。
int strnatcasecmp(string $string1, string $string2)
返品値は整数です。
<0 : string1はstring2未満です
= 0 :2つの文字列が等しい
> 0 : string1はstring2よりも大きい
標準のSTRCASECMPは、文字列内の数字の意味に関係なく、文字で文字の文字のASCII値を比較します。 strnatcasecmpは「自然なソート」を採用しています。つまり、文字列全体の数字を扱います。例えば:
var_dump(strcasecmp("file2.txt", "file10.txt")); // 戻る > 0
var_dump(strnatcasecmp("file2.txt", "file10.txt")); // 戻る < 0
これにより、 strnatcasecmpは、ファイル名、バージョン番号などの数字との文字列の比較に特に適しています。
StrnatcasecmpはASCII文字のケースを正しく処理しますが、国際的なキャラクター(Diacritic Notes、非ラチンキャラクターなどのラテン文字など)に関しては「完全に国際的な」サポートはありません。つまり、一部のマルチバイト文字では、予想どおりに動作しない場合があります。
例えば:
echo strnatcasecmp("café", "CAFé");
この比較は、PHPの基礎となる文字エンコードと内部実装に応じて、2つの文字列が等しいとは考えられない場合があります。
真に国際的で言語に敏感なソート動作が必要な場合は、PHPのINTL拡張機能でコレートクラスを使用できます。
$collator = new Collator('fr_FR');
echo $collator->compare("café", "CAFé"); // 出力 0,平等を示します
Collatorは複数の言語とロケールをサポートしており、国際的なキャラクターをよりよく処理できます。
ユーザーが異なるケースを持つファイル名をアップロードし、数字を持っている可能性があることを考慮して、Webサイトにアップロードされたファイル名をソートすると仮定します。ここに、 StrnatCaseCMPを使用したサンプルコードがあります。
$files = ["image10.jpg", "Image2.jpg", "image1.JPG", "Image20.jpg"];
usort($files, function($a, $b) {
return strnatcasecmp($a, $b);
});
foreach ($files as $file) {
echo "<a href='https://gitbox.net/uploads/{$file}'>{$file}</a><br>";
}
出力の結果は次のとおりです。
image1.JPG
Image2.jpg
image10.jpg
Image20.jpg
ソート結果は人間の自然習慣に沿っており、ファイル名の場合を無視していることがわかります。
strnatcasecmpは、偶然の感度なしに「自然な順序」で文字列を比較するための強力で実用的なツールです。
ファイル名、ラベル、バージョン番号など、数字の文字列に特に適しています。
国際的なキャラクターを含む比較の場合、 StrnatCaseCMPは理想的ではない場合があり、現時点ではINTL拡張コラーターを使用することをお勧めします。
strnatcasecmpの使用法をマスターすると、ユーザー入力とソートロジックをより自然に処理し、PHPアプリケーションをよりスマートでユーザーフレンドリーにすることができます。