PHPでは、特にテキストデータを処理する場合、文字列比較は一般的な操作です。標準の文字列比較関数は通常、 strcmp()またはstrcasecmp()を使用しますが、これらの関数は、数字の自然な順序に関係なく、文字通りの順序でのみ比較されます。これは、期待を満たさないいくつかの比較結果につながる可能性があります。この問題を解決するために、PHPはstrnatcmp()関数を提供します。これは、文字列を「自然にソートする」ために使用されます。この比較は、辞書の順序ではなく、「10」前の「2」など、日常生活の数字を整理する方法に似ています。
この記事では、strnatcmp()関数の基本的な使用法を詳細に分析し、例を通じて誰もがよりよく理解するのに役立ちます。
strnatcmp()関数は、2つの文字列を比較し、自然なソートルールに従ってそれらの違いを返すために使用されます。従来の文字列の比較とは異なり、 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">$string1</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$string2</span></span><span> )
</span></span>$ string1 :比較する最初の文字列。
$ string2 :比較する2番目の文字列。
返品値:
$ string1および$ string2が等しい場合、 0を返します。
$ string1が$ string2未満の場合、負の値が返されます。
$ string1が$ string2を超える場合、正の値が返されます。
Strcmp()関数は、文字のASCII値に従って文字列のみを1つずつ比較しますが、 Strnatcmp()は数字の自然な並べ替えを考慮します。たとえば、2つの文字列「10」と「2」を比較する場合:
strcmp( "10"、 "2")を使用すると、結果は負の値になります(「1」のASCII値は「2」のASCII値よりも小さいため)。
strnatcmp( "10"、 "2")を使用する場合、数字10は明らかに数字2よりも大きいため、結果は正の値です。
strnatcmp()の基本的なアイデアは、文字列の数字を数字として比較することです。文字列の数値部分を整数に変換し、数値のサイズで比較します。数字のない部品の場合、それらはまだ文字の辞書順序で比較されます。
例えば:
「IMG12」と「IMG2」を比較すると、 STRNATCMP()は最初に「IMG」部分(同じ)を比較し、次に数値部分を比較します。 12は2を超えるため、正の値が最終的に返されます。
以下は、strnatcmp()の実用的なアプリケーションを示す簡単なコード例です。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$str1</span></span><span> = </span><span><span class="hljs-string">"img12"</span></span><span>;
</span><span><span class="hljs-variable">$str2</span></span><span> = </span><span><span class="hljs-string">"img2"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strnatcmp</span></span><span>(</span><span><span class="hljs-variable">$str1</span></span><span>, </span><span><span class="hljs-variable">$str2</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> < </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$str1</span></span></span><span> is less than </span><span><span class="hljs-subst">$str2</span></span><span>\n";
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$str1</span></span></span><span> is greater than </span><span><span class="hljs-subst">$str2</span></span><span>\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$str1</span></span></span><span> is equal to </span><span><span class="hljs-subst">$str2</span></span><span>\n";
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>出力:
<span><span>img12 </span><span><span class="hljs-keyword">is</span></span><span> greater than img2
</span></span>strnatcmp()は、特に数字を含む文字列を扱う場合、自然な並べ替えが必要なシナリオに非常に適しています。例えば:
ファイル名のソート:ファイル名に番号が含まれている場合、 strnatcmp()は、 「file10」の前の「file2」などの一般的な自然な順序でソートできます。
バージョン番号の比較:バージョン番号が文字列として保存されている場合、 strnatcmp()は、「1.10」や「1.2」などのバージョン番号を正しく比較するのに役立ちます。
strnatcmp()は文字列比較のみをサポートするため、配列または他のタイプのデータを比較する必要がある場合は、まず文字列に変換する必要があります。
strnatcmp()は症例に敏感です。ケースを無視する必要がある場合は、 strnatcmp()に似ているが、文字の場合は無視されるstrnatcasecmp()を使用できます。
strnatcmp() :ケースに敏感な自然ソート比較。
strnatcasecmp() :上限と小文字の自然な比較を無視します。
例えば:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$str1</span></span><span> = </span><span><span class="hljs-string">"Apple12"</span></span><span>;
</span><span><span class="hljs-variable">$str2</span></span><span> = </span><span><span class="hljs-string">"apple2"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">strnatcmp</span></span><span>(</span><span><span class="hljs-variable">$str1</span></span><span>, </span><span><span class="hljs-variable">$str2</span></span><span>); </span><span><span class="hljs-comment">// 負の数を出力します,なぜなら"A"未満"a"</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">strnatcasecmp</span></span><span>(</span><span><span class="hljs-variable">$str1</span></span><span>, </span><span><span class="hljs-variable">$str2</span></span><span>); </span><span><span class="hljs-comment">// 出力0,なぜなら忽略大小写后相等</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>strnatcmp()は、自然な順序の比較が必要なシナリオで非常に効率的な非常に有用な関数です。数字を含む文字列を正しく処理し、通常理解している順序で比較することができます。ファイル名の並べ替え、バージョン番号の比較、またはその他の同様のタスクであろうと、 strnatcmp()は非常に便利です。
数字の並べ替えを考慮する必要がある文字列を扱う際に状況に遭遇した場合、 strnatcmp()が推奨されるオプションです。