ファイル名ソートを扱うとき、PHPは非常に実用的な関数strnatcmp()を提供します。辞書の順序による従来のソートとは異なり、自然なソートは、 file2.txtなど、 file10.txtの前にランク付けされるなど、文字列の数値を考慮します。これは、数値(画像シーケンス、ログファイルなど)を含むファイル名を扱う場合に特に役立ちます。この記事では、strnatcmp()の使用に関するいくつかの実用的な手法と一般的な予防策を調べます。
strnatcmp()は2つの文字列パラメーターを受け入れ、整数値を返して比較結果を表します。
<?php
echo strnatcmp("file2.txt", "file10.txt"); // 出力 -1
?>
実際のソートでは、通常、 usort()で使用されます。
<?php
$files = ["file10.txt", "file2.txt", "file1.txt"];
usort($files, "strnatcmp");
print_r($files);
?>
出力:
Array
(
[0] => file1.txt
[1] => file2.txt
[2] => file10.txt
)
strnatcmp()はケースに敏感であり、場合によってはソートを予想通りにしないようにする可能性があります。例えば:
<?php
$files = ["File2.txt", "file10.txt"];
usort($files, "strnatcmp");
print_r($files);
?>
ケースを無視するために、 strnatcasecmp()を使用できます。
<?php
usort($files, "strnatcasecmp");
?>
ファイルパスにディレクトリ( Images/file2.jpgやImages/file10.jpgなど)が含まれている場合、 strnatcmp()を直接使用すると、ディレクトリ構造ソートが混乱する可能性があります。したがって、最初にファイル名を抽出してから並べ替えることができます。
<?php
$paths = ["images/file10.jpg", "images/file2.jpg"];
usort($paths, function($a, $b) {
return strnatcmp(basename($a), basename($b));
});
?>
自然なソートは、文字列の一部として拡張機能を扱います。ソートのために拡張機能を無視する必要がある場合は、接尾辞を削除してから比較できます。
<?php
function strip_extension($filename) {
return pathinfo($filename, PATHINFO_FILENAME);
}
$files = ["image10.png", "image2.jpg"];
usort($files, function($a, $b) {
return strnatcmp(strip_extension($a), strip_extension($b));
});
?>
実際のアプリケーションでは、ディレクトリとファイルが混合されることがよくあります。ソートするときは、通常、ディレクトリを前に置くことを望みます。 is_dir()およびstrnatcmp()と組み合わせて並べ替えることができます。
<?php
$entries = ["docs", "image2.jpg", "image10.jpg"];
usort($entries, function($a, $b) {
$a_is_dir = is_dir("gitbox.net/files/" . $a);
$b_is_dir = is_dir("gitbox.net/files/" . $b);
if ($a_is_dir && !$b_is_dir) return -1;
if (!$a_is_dir && $b_is_dir) return 1;
return strnatcmp($a, $b);
});
?>
注: is_dir()を使用して正しく識別するためには、パスがリアルである必要があります。仮想パスの場合、他の方法でファイルタイプをマークすることができます。
より複雑なソートロジックを実現するために、自然なソートを多次元配列、ファイルタイムスタンプなどと組み合わせることもできます。たとえば、ファイル名を自然に並べ替えた後、変更時間の下降順に並べ替えます。
<?php
$files = ["file10.txt", "file2.txt", "file1.txt"];
usort($files, function($a, $b) {
$result = strnatcmp($a, $b);
if ($result === 0) {
return filemtime("gitbox.net/uploads/" . $b) - filemtime("gitbox.net/uploads/" . $a);
}
return $result;
});
?>
デジタルシーケンス(スクリーンショット、ビデオフレーム、ログなど)を備えたファイル名。
ユーザーを直感的に理解する必要があるソート方法
ディレクトリブラウザやファイルマネージャーなどのインターフェイスに優しいアプリケーション
厳格な機械認識ソート(ハッシュバリューやエンコーディングルールなど)
ケースに敏感または非標準の命名シナリオ
strnatcmp()は、PHPでの自然なソートを扱うための強力なツールであり、ファイル名ソートのユーザーエクスペリエンスを大幅に改善できます。その使用と予防策を習得すると、ファイル処理関連のアプリケーションがより快適になります。使用中に、ケースを無視するか、ファイル名を抽出するか、実際のシナリオに基づいてソートに参加する必要があるかどうかを判断する必要があることに注意する必要があります。