現在の位置: ホーム> 最新記事一覧> PHPのStrnatcasecmpでファイル名を自然に並べ替える方法は?

PHPのStrnatcasecmpでファイル名を自然に並べ替える方法は?

gitbox 2025-05-20

多くのシナリオでは、ファイル名でソートする必要があります。辞書ソートなどの一般的なソートメソッドは、予期しない結果につながる可能性があります。たとえば、「2」が「1」よりも小さいため、辞書でsort by dictionary、 file2.txtはfile10.txtの前にランク付けされます。ただし、ユーザーは通常、ファイル名を数値的に並べ替える必要があります。つまり、 file2.txtはfile10.txtの後に配置する必要があります。

PHPのstrnatcasecmp関数は、この要件を満たすように設計されています。 2つの文字列を比較して、自然なソートルールに従って並べ替えることができます。 strnatcasecmpは、ファイル名の並べ替えに非常に適した「ケースに依存しない」自然ソート方法です。

自然なソートとは何ですか?

自然なソートは、人間の直感的なソートに基づいています。たとえば、ファイル名file1file2file10の場合、本質的なソートの結果は次のとおりです。

 file1
file2
file10

辞書ソート結果の代わりに:

 file1
file10
file2

自然な選別にstrnatcasecmpを使用する方法は?

strnatcasecmpは、2つの文字列を比較し、自然なソートルールに従って比較するPHPで非常に有用な機能です。この関数の構文は次のとおりです。

 int strnatcasecmp ( string $string1 , string $string2 )
  • $ string1$ string2は、比較する2つの文字列です。

  • 関数返品値:

    • $ string1が$ string2未満の場合、負の整数が返されます。

    • $ string1$ string2に等しい場合、0を返します。

    • $ string1$ string2を超える場合、正の整数が返されます。

この関数を通じて、ファイル名の自然な並べ替えを簡単に実装できます。 Strnatcasecmpを使用してファイル名を並べ替える方法を示す例を以下に示します。

サンプルコード

次のファイル名があるとします。

 $files = ['file10.txt', 'file2.txt', 'file1.txt', 'file20.txt', 'file11.txt'];

ファイル名が数値的に配置されるように、これらのファイル名を自然に並べ替えたいと考えています。 strnatcasecmpを使用して達成できます。

 <?php
$files = ['file10.txt', 'file2.txt', 'file1.txt', 'file20.txt', 'file11.txt'];

// 使用 usort そして strnatcasecmp 自然なソートを行います
usort($files, 'strnatcasecmp');

// ソートされたファイル名を出力します
print_r($files);
?>

コード解析

  1. ファイル名$ファイルの配列を定義します。

  2. USORT関数を使用して、配列とコールバック関数をパラメーターとして受け入れる配列をソートします。ここでは、 strnatcasecmpをコールバック関数としてusortに渡します。

  3. 並べ替えが完了すると、 $ファイルアレイのファイル名は、自然なソートのルールに従って配置されます。

出力結果

Array
(
    [0] => file1.txt
    [1] => file2.txt
    [2] => file10.txt
    [3] => file11.txt
    [4] => file20.txt
)

ご覧のとおり、ファイル名は既に数字の順序でソートされています。このようにして、 file2.txtfile10.txtの前にランク付けされています。

strnatcasecmpstrnatcmpの違い

strnatcmpstrnatcasecmpはどちらも自然な並べ替えのためにPHPで使用される関数です。 2つの違いは次のとおりです。

  • strnatcmpはケースに敏感です。

  • strnatcasecmpはケース非感受性です。

ファイル名のケースの違いを無視する場合は、 Strnatcasecmpを使用できます。それ以外の場合は、 strnatcmpを使用することを選択できます。

Strnatcasecmpが通常のstrcmpよりも優れているのはなぜですか?

STRCMPなどの通常の文字列比較関数を使用してソートする場合、「file2.txt」や「file10.txt」などの問題に遭遇する可能性があり、結果は直感的な数値で配置されません。 strnatcasecmpは、文字列が数値的に比較されることを保証できます。これは、特に自然な並べ替えを必要とするファイル名、バージョン番号などに関しては、ユーザーの期待に沿ったものです。