現在の位置: ホーム> 最新記事一覧> PHPのstrnatcmp関数を使用して文字列を自然に並べ替える方法は?実用的な方法の詳細な説明

PHPのstrnatcmp関数を使用して文字列を自然に並べ替える方法は?実用的な方法の詳細な説明

gitbox 2025-09-16

PHPのstrnatcmp関数を使用して文字列を自然に並べ替える方法は?実用的な方法の詳細な説明

開発中、私たちはしばしば一連の文字列を並べ替える必要があります。従来のソートメソッドは、辞書の順序で文字列を並べ替えることがよくありますが、並べ替え結果を「自然なソート」ルールに準拠させたい場合があります。つまり、値は、文字列の文字順で並べ替えるのではなく、実際のサイズでソートされます。 PHPは、自然なソートを実装するのに役立つ非常に有用な関数strnatcmp()を提供します。

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

名前が示すように、自然なソートは、人間の従来の理解に従ってデータの並べ替えを指します。たとえば、ファイル名をソートする場合、「file10」には、辞書の順序で最初である代わりに「file2」が続く必要があります。従来の辞書ソートルールは、「1」が「2」未満であるため、「File2」の前に「File10」をランク付けしますが、自然なソートは数値サイズでソートされます。

strnatcmp()関数の紹介

PHPのstrnatcmp()関数は、2つの文字列を比較するための自然なソート関数です。 strcmp()に似ていますが、 strnatcmp()は、人間のようなソートルールを可能にし、文字列の数値部分をよりインテリジェントに処理します。

関数プロトタイプ:

 <span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">strnatcmp</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str1</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$str2</span></span><span> )
</span></span>
  • $ str1および$ str2 :これらの2つのパラメーターは、比較する必要がある2つの文字列です。

  • 返品値: $ STR1が$ STR2の前にランク付けされている場合、負の整数を返します。 $ STR1$ STR2に等しい場合、0が0に戻ります。 $ str1が$ str2の後にランク付けされている場合、正の整数を返します。

strnatcmp()の仕組み

従来の文字列の比較関数とは異なり、 strnatcmp()は文字列の数値部分を解析し、実際の数値サイズに基づいて比較します。比較結果が決定されるまで、文字列の各部分を1つずつ比較します。

たとえば、 「file10」「file2」を比較する場合、 strnatcmp()は最初に文字パーツ「ファイル」を比較し、次に番号パート102を比較し続けます。 102を超えるため、 「File10」は「File2」の背後にランク付けされます。

例: Strnatcmp()を自然並べ替えに使用する方法

strnatcmp()を使用してファイル名のセットを自然に並べ替えることができます。コードは次のとおりです。

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// ソートされる文字列の配列</span></span><span>
</span><span><span class="hljs-variable">$fileNames</span></span><span> = [</span><span><span class="hljs-string">'file2.txt'</span></span><span>, </span><span><span class="hljs-string">'file10.txt'</span></span><span>, </span><span><span class="hljs-string">'file1.txt'</span></span><span>, </span><span><span class="hljs-string">'file12.txt'</span></span><span>, </span><span><span class="hljs-string">'file11.txt'</span></span><span>];

</span><span><span class="hljs-comment">// 使用usort()組み合わせたstrnatcmp()自然なソートを行います</span></span><span>
</span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-variable">$fileNames</span></span><span>, </span><span><span class="hljs-string">'strnatcmp'</span></span><span>);

</span><span><span class="hljs-comment">// 出力ソートされた結果</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$fileNames</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span> . PHP_EOL;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

出力結果:

 <span><span>file1.txt
file2.txt
file10.txt
file11.txt
file12.txt
</span></span>

この例では、最初にファイル名を含む配列を作成し、次にUSORT()関数を使用して、Arrayをstrnatcmp()で自然にソートします。ソートされた配列は、予想される順序と一致しており、数値部分はサイズが配置されています。

その他の関連関数

strnatcmp()に加えて、phpはstrnatcmp()関数に類似したstrnatcasecmp()も提供しますが、 strnatcasecmp()は比較時にケースの違いを無視します。

例:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 忽略大小写自然なソートを行います</span></span><span>
</span><span><span class="hljs-variable">$fileNames</span></span><span> = [</span><span><span class="hljs-string">'File2.txt'</span></span><span>, </span><span><span class="hljs-string">'file10.txt'</span></span><span>, </span><span><span class="hljs-string">'File1.txt'</span></span><span>, </span><span><span class="hljs-string">'file12.txt'</span></span><span>, </span><span><span class="hljs-string">'file11.txt'</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-variable">$fileNames</span></span><span>, </span><span><span class="hljs-string">'strnatcasecmp'</span></span><span>);

</span><span><span class="hljs-comment">// 出力ソートされた結果</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$fileNames</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span> . PHP_EOL;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

出力結果:

 <span><span>File1.txt
File2.txt
file10.txt
file11.txt
file12.txt
</span></span>

結論は

strnatcmp()およびstrnatcasecmp()を使用することにより、数字を含む文字列を自然に簡単に並べ替えて、選別の結果が人間の直観に沿っていることを確認できます。これらの機能は、自然なソートを必要とするファイル名の並べ替え、バージョン番号の比較などのシナリオに非常に適しています。

この記事が、PHPでの自然な選別機能とそのアプリケーションをよりよく理解するのに役立つことを願っています。