ファイル名を操作するとき、私たちは時々、英数字を自然に並べ替える必要があるシナリオに遭遇します。多くの場合、ソート結果に問題がある場合があります。たとえば、アルファベット順の順序により、「file10.txt」は「file2.txt」より先にある場合があります。自然なソートを実現するために、つまり、数値を実際のサイズでソートすると、PHPのstrnatcasecmp関数を使用できます。この記事では、この関数を使用して、ファイル名のアルファナメラル自然並べ替えを実装する方法を詳細に説明します。
strnatcasecmpは、症例に依存しない英数字の自然並べ替えを実行するためのPHPの組み込み関数です(「自然順序」とも呼ばれます)。従来の文字列比較関数とは異なり、 StrnatCaseCMPは、文字ごとのASCII値ではなく、数値部分を数値サイズで比較します。
strnatcasecmp(string $string1, string $string2): int
$ string1 :比較する最初の文字列。
$ string2 :比較する2番目の文字列。
この関数は次の値を返します。
$ string1が$ string2未満の場合、負の整数が返されます。
$ string1が$ string2に等しい場合、0を返します。
$ string1が$ string2を超える場合、正の整数が返されます。
ファイル名を含む配列があるとしたら、 Strnatcasecmpを使用してファイル名を並べ替えることができます。特定の手順は次のとおりです。
ファイル名の配列を取得します。
USORT関数を使用して、 StrnatCaseCMPを組み合わせてファイル名配列をソートします。
<?php
// ファイルアレイ
$files = [
"file1.txt",
"file10.txt",
"file2.txt",
"file12.txt",
"file11.txt",
];
// 使用 strnatcasecmp 自然なソートを行います
usort($files, function($a, $b) {
return strnatcasecmp($a, $b);
});
// ソートされたファイル名を出力します
foreach ($files as $file) {
echo $file . "\n";
}
?>
配列定義:最初に、数値サイズでソートする問題を引き起こす可能性のあるファイル名を含む配列$ファイルを定義します。
自然なソート: USORT関数を使用して配列をソートします。 USORTでは、配列内の各要素を比較するためにコールバック関数が必要です。自然なソートには、コールバック関数でstrnatcasecmpを使用します。
出力ソートされたファイル名:ソート後、 foreachを使用してループしてソートされたファイル名を出力して、それらが自然に配置されていることを確認します。
他の文字列比較関数と比較して、 StrnatCaseCMPは、数値を含むファイル名を正しく処理できます。数値を文字の比較ではなく、数値サイズでソートします。これにより、「file10」が「file2」の前にランク付けされるという問題が回避されます。
上記のコードを実行すると、出力は次のとおりです。
file1.txt
file2.txt
file10.txt
file11.txt
file12.txt
ご覧のとおり、ファイル名は自然な英数字でソートされます。
いくつかのシナリオでは、URLからファイル名を取得してソートする必要がある場合があります。 URLにファイル名が含まれている場合、最初にURLを解析してファイル名を抽出し、次にstrnatcasecmpを使用してソートできます。たとえば、URLにファイルパスが含まれている場合、 Parse_urlとBasenameを使用してファイル名を取得できます。
次のURLがあるとします。
<?php
// URL 配列
$urls = [
"https://gitbox.net/files/file1.txt",
"https://gitbox.net/files/file10.txt",
"https://gitbox.net/files/file2.txt",
];
// ファイル名を抽出します并自然なソートを行います
usort($urls, function($a, $b) {
// ファイル名を抽出します
$fileA = basename(parse_url($a, PHP_URL_PATH));
$fileB = basename(parse_url($b, PHP_URL_PATH));
// 使用 strnatcasecmp ファイル名を比較します
return strnatcasecmp($fileA, $fileB);
});
// 出力ソート URL
foreach ($urls as $url) {
echo $url . "\n";
}
?>
最初にURLを含む配列$ URLを定義します。
parse_url関数を使用してURLのパス部分を抽出し、 Basenameを使用してファイル名を取得します。
strnatcasecmpを使用して、ファイル名を自然に並べ替えます。
https://gitbox.net/files/file1.txt
https://gitbox.net/files/file2.txt
https://gitbox.net/files/file10.txt
PHPでstrnatcasecmp関数を使用することにより、ファイル名の英数字の順序付けを簡単に実装し、ファイル名の数値部分が数値サイズでソートされるようにします。ファイル名配列のソートであろうと、URLからファイル名を抽出してソートするかどうかにかかわらず、 Strnatcasecmpは正しいソート結果を得るのに役立ちます。
この記事が、 strnatcasecmp機能の使用を理解するのに役立つことを願っています。ご質問がある場合は、お気軽にご質問ください!