PHPでは、 strnatcmpは非常に実用的な機能であり、文字列を「自然にソートした」文字列を比較するために使用できます。自然なソートは、文字通りのキャラクターの順序だけでなく、数字の実際のサイズでソートすることです。このアプローチは、特にユーザー入力を比較する必要がある場合、数字を含む文字列を扱う場合に特に役立ちます。この記事では、 strnatcmp関数を使用してユーザーが入力した文字列を標準化し、いくつかの例を使用してアプリケーションシナリオを表示する方法を紹介します。
strnatcmpは、2つの文字列を比較するためのPHPの関数です。 strcmpなどの通常の文字列比較関数とは異なり、 strnatcmpは数字のサイズを考慮しているため、文字列の数値部分に従って文字列を「自然に並べ替える」ことができます。これは、自然な並べ替えでは、「10」が文字通りの比較ではなく、「2」より大きいと見なされることを意味します。
関数の署名は次のとおりです。
<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未満です
正の数値を返す: $ string1が$ string2を超えることを意味します
return 0:2つの文字列が等しいことを意味します
従来の文字列比較関数( STRCMPなど)は、数字を含む文字列を比較する際に直感に反する結果をもたらす可能性があります。例えば:
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-string">'10'</span></span><span>, </span><span><span class="hljs-string">'2'</span></span><span>); </span><span><span class="hljs-comment">// 正の数を出力します</span></span><span>
</span></span>
これは、 10が2より大きいことを示していますが、自然なソートのコンテキストでは、10号は2後になるはずです。StranatCMPはこの問題を解決できます。
<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-string">'10'</span></span><span>, </span><span><span class="hljs-string">'2'</span></span><span>); </span><span><span class="hljs-comment">// 出力の負の数,急行 '10' 未満 '2'</span></span><span>
</span></span>
ユーザーが複数の文字列(ファイル名、バージョン番号、または番号を含む他の文字列など)を入力したフォームで作業している場合、これらの文字列の並べ替えまたは比較を正規化するとします。 strnatcmpを使用すると、これらの文字列を自然なソートに合わせて合理的に並べ替えることができます。
<span><span><span class="hljs-comment">// ユーザーが次のファイル名を入力したとします</span></span><span>
</span><span><span class="hljs-variable">$files</span></span><span> = [</span><span><span class="hljs-string">'file10.txt'</span></span><span>, </span><span><span class="hljs-string">'file2.txt'</span></span><span>, </span><span><span class="hljs-string">'file1.txt'</span></span><span>, </span><span><span class="hljs-string">'file20.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">$files</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">$files</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> . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>
出力結果:
<span><span>file1.txt
file2.txt
file10.txt
file20.txt
</span></span>
この例では、 strnatcmpは、ファイル名が文字の順序ではなく数字のサイズによってソートされることを保証します。
もう1つの一般的な使用シナリオは、バージョン番号を比較することです。ユーザーが2つのバージョン番号を入力し、サイズを比較したいとします。
<span><span><span class="hljs-variable">$version1</span></span><span> = </span><span><span class="hljs-string">'1.10.2'</span></span><span>;
</span><span><span class="hljs-variable">$version2</span></span><span> = </span><span><span class="hljs-string">'1.9.9'</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">$version1</span></span><span>, </span><span><span class="hljs-variable">$version2</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">$version1</span></span></span><span> is less than </span><span><span class="hljs-subst">$version2</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">$version1</span></span></span><span> is greater than </span><span><span class="hljs-subst">$version2</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">$version1</span></span></span><span> is equal to </span><span><span class="hljs-subst">$version2</span></span><span>\n";
}
</span></span>
出力結果:
<span><span><span class="hljs-number">1.10</span></span><span><span class="hljs-number">.2</span></span><span> </span><span><span class="hljs-keyword">is</span></span><span> greater than </span><span><span class="hljs-number">1.9</span></span><span><span class="hljs-number">.9</span></span><span>
</span></span>
strnatcmpを介して、バージョン番号を正確に比較して、従来の文字列比較方法のエラーを回避できます。
ユーザー入力検証:ユーザーが入力した文字列を処理する場合、文字列の内容を並べ替えたり比較したりすることができます。 strnatcmpは、数字のサイズに応じて文字列を合理的に並べ替え、ユーザーエクスペリエンスを向上させるのに役立ちます。
ファイル名ソート: STRNATCMPは、特にファイル名に番号が含まれている場合、ファイル名のセットを並べ替える必要がある場合に非常に効果的なツールです。
バージョン番号管理:ソフトウェアバージョン番号またはその他の類似データを管理する必要があるシステムの場合、 StrnatCMPは、バージョン番号の比較が文字の順序ではなく数のサイズに基づいていることを確認でき、それにより正確な比較結果が得られます。
strnatcmp関数は、文字列を自然に並べ替える機能を提供し、数字を含む文字列の処理に特に適しています。通常の文字列比較関数よりも、人間の自然な並べ替えルールに沿っています。この記事の導入を通じて、特にユーザー入力、ファイル名、バージョン番号の比較の観点から、実際のアプリケーションでSTRNATCMPの利点を見ることができます。