現在の位置: ホーム> 最新記事一覧> strnatcmpを使用してファイル名を並べ替えるためのヒント

strnatcmpを使用してファイル名を並べ替えるためのヒント

gitbox 2025-05-27

ファイル名ソートを扱うとき、PHPは非常に実用的な関数strnatcmp()を提供します。辞書の順序による従来のソートとは異なり、自然なソートは、 file2.txtなど、 file10.txtの前にランク付けされるなど、文字列の数値を考慮します。これは、数値(画像シーケンス、ログファイルなど)を含むファイル名を扱う場合に特に役立ちます。この記事では、strnatcmp()の使用に関するいくつかの実用的な手法と一般的な予防策を調べます。

1。基本的な使用法

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
)

2。症例感度の問題

strnatcmp()はケースに敏感であり、場合によってはソートを予想通りにしないようにする可能性があります。例えば:

 <?php
$files = ["File2.txt", "file10.txt"];
usort($files, "strnatcmp");
print_r($files);
?>

ケースを無視するために、 strnatcasecmp()を使用できます。

 <?php
usort($files, "strnatcasecmp");
?>

3。ソートのファイルパスのスキルの処理

ファイルパスにディレクトリ( Images/file2.jpgImages/file10.jpgなど)が含まれている場合、 strnatcmp()を直接使用すると、ディレクトリ構造ソートが混乱する可能性があります。したがって、最初にファイル名を抽出してから並べ替えることができます。

 <?php
$paths = ["images/file10.jpg", "images/file2.jpg"];
usort($paths, function($a, $b) {
    return strnatcmp(basename($a), basename($b));
});
?>

4.ファイル拡張機能の影響

自然なソートは、文字列の一部として拡張機能を扱います。ソートのために拡張機能を無視する必要がある場合は、接尾辞を削除してから比較できます。

 <?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));
});
?>

5。ミックスディレクトリとファイルの配置の処理

実際のアプリケーションでは、ディレクトリとファイルが混合されることがよくあります。ソートするときは、通常、ディレクトリを前に置くことを望みます。 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()を使用して正しく識別するためには、パスがリアルである必要があります。仮想パスの場合、他の方法でファイルタイプをマークすることができます。

6.自然なソートを組み合わせて、より複雑なソートロジックを実現する

より複雑なソートロジックを実現するために、自然なソートを多次元配列、ファイルタイムスタンプなどと組み合わせることもできます。たとえば、ファイル名を自然に並べ替えた後、変更時間の下降順に並べ替えます。

 <?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;
});
?>

7。適用可能なシナリオと適用できないシナリオ

該当するシナリオ:

  • デジタルシーケンス(スクリーンショット、ビデオフレーム、ログなど)を備えたファイル名。

  • ユーザーを直感的に理解する必要があるソート方法

  • ディレクトリブラウザやファイルマネージャーなどのインターフェイスに優しいアプリケーション

適用されないシナリオ:

  • 厳格な機械認識ソート(ハッシュバリューやエンコーディングルールなど)

  • ケースに敏感または非標準の命名シナリオ

結論

strnatcmp()は、PHPでの自然なソートを扱うための強力なツールであり、ファイル名ソートのユーザーエクスペリエンスを大幅に改善できます。その使用と予防策を習得すると、ファイル処理関連のアプリケーションがより快適になります。使用中に、ケースを無視するか、ファイル名を抽出するか、実際のシナリオに基づいてソートに参加する必要があるかどうかを判断する必要があることに注意する必要があります。