PHPでは、 strnatcmp関数は、2つの文字列の自然秩序(自然な種類)を比較するためのツールです。 STRNATCMPは、文字のASCII値だけでなく、数字のサイズでソートするため、 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>
この関数は、2つの文字列パラメーター$ STR1と$ STR2を取得し、2つの文字列の自然な順序比較結果を表す整数値を返します。
$ STR1が$ STR2未満の場合、負の値が返されます。
$ str1が$ str2に等しい場合、0を返します。
$ STR1が$ STR2を超える場合、正の値が返されます。
負の値を返す:
strnatcmpが負の値を返すと、最初の文字列$ str1が2番目の文字列$ str2の前に自然な種類でランク付けされることを意味します。例えば:
<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">"apple10"</span></span><span>, </span><span><span class="hljs-string">"apple2"</span></span><span>); </span><span><span class="hljs-comment">// 出力ネガティブ値</span></span><span>
</span></span>
この例では、 「Apple10」は「Apple2」の前に自然に並べ替えられます。これは、番号10が2番よりも大きいためです。
0を返します:
2つの文字列が自然なソートで同じ場合、 strnatcmpは0を返します。たとえば、:
<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">"apple2"</span></span><span>, </span><span><span class="hljs-string">"apple2"</span></span><span>); </span><span><span class="hljs-comment">// 出力0</span></span><span>
</span></span>
ここでは、2つの文字列がまったく同じなので、0を返します。
正の値を返します:
strnatcmpが正の値を返すと、最初の文字列$ str1が自然な種類の2番目の文字列$ str2の後にランク付けされることを意味します。例えば:
<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">"apple20"</span></span><span>, </span><span><span class="hljs-string">"apple2"</span></span><span>); </span><span><span class="hljs-comment">// 出力正值</span></span><span>
</span></span>
この例では、 「Apple20」は「Apple2」の後に自然な種類でランク付けされます。
簡単な比較:
2つの文字列のどれが大きいかを判断したい場合は、戻り値を直接使用できます。例えば:
<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> でランク付けされています </span><span><span class="hljs-subst">$str2</span></span><span> フロント";
} </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> でランク付けされています </span><span><span class="hljs-subst">$str2</span></span><span> 後で";
} </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> そして </span><span><span class="hljs-subst">$str2</span></span><span> 同じ";
}
</span></span>
この処理方法は、ソートまたは比較が必要なシナリオに適しています。
ソートでの使用:
STRNATCMPは、特に数字を含む文字列を扱う場合、アレイの自然な並べ替えによく使用されます。アレイを自然な順序で並べ替える場合は、 Strnatcmpと組み合わせてUsort関数を使用できます。
<span><span><span class="hljs-variable">$array</span></span><span> = [</span><span><span class="hljs-string">"apple10"</span></span><span>, </span><span><span class="hljs-string">"apple2"</span></span><span>, </span><span><span class="hljs-string">"apple20"</span></span><span>, </span><span><span class="hljs-string">"apple1"</span></span><span>];
</span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, </span><span><span class="hljs-string">'strnatcmp'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span></span>
これは出力されます:
<span><span>Array
(
[</span><span><span class="hljs-meta">0</span></span><span>] => apple1
[</span><span><span class="hljs-meta">1</span></span><span>] => apple2
[</span><span><span class="hljs-meta">2</span></span><span>] => apple10
[</span><span><span class="hljs-meta">3</span></span><span>] => apple20
)
</span></span>
複雑な状況の処理:
文字列を含む文字列、バージョン番号などなど、より複雑な文字列を比較する必要がある場合があります。この場合、 strnatcmpは、文字列の数値部分が文字によって誤って比較されることを心配することなく、自然な順序で比較するのに役立ちます。
<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-string">"version 10.1"</span></span><span>, </span><span><span class="hljs-string">"version 9.9"</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">"version 10.1 比較する version 9.9 更新します"</span></span><span>;
}
</span></span>
出力は次のとおりです。バージョン10.1はバージョン9.9よりも更新されます。これは、 strnatcmpが自然な順序でバージョン番号を正しく処理することを示しています。
strnatcmpは、特に数字の文字列を扱う場合、より直感的なソート方法を提供できる場合に、自然なソートルールを通して文字列を比較する非常に便利なPHP関数です。リターン値の肯定的および否定的な意味を理解し、それらを正しく処理できることは、開発者が文字列比較と並べ替え操作をより効率的に実行するのに役立ちます。