PHPでは、 strnatcasecmpは「自然順序」比較の関数です。 STRCMPやStrCaseCMPなどの通常の文字列比較関数とは異なり、 StrnatCaseCMPは、文字列の自然な並べ替え(たとえば、数字のサイズの順序)に比べて比較されるため、数字を含む文字列を扱う場合、結果はより直観的です。
ただし、場合によっては、 strnatcasecmpで並べ替える場合、結果は予想どおりではない場合があります。これは通常、いくつかの一般的な理由によって引き起こされます。
strnatcasecmpを使用してソートする場合、ソートする文字列に特殊文字(スペース、シンボルなど)が含まれている場合、または形式で一貫性がない場合、比較の結果に影響を与える可能性があります。たとえば、さまざまな上部および小文字、特殊文字、または数値間隔を持つ文字列を含めると、ソートが期待と矛盾する場合があります。
解決:
まず、不要なスペースを削除したり、文字の上限と小文字を統合したり、不要なシンボルを削除したりするなど、文字列を標準化します。
$strings = ['Item 10', 'Item 2', 'Item 1'];
// 標準化された文字列
$normalized_strings = array_map(function($str) {
return strtolower(trim($str)); // 小文字に目を向け、スペースを取り外します
}, $strings);
// 使用 strnatcasecmp 選別
usort($normalized_strings, 'strnatcasecmp');
print_r($normalized_strings);
strnatcasecmpの自然な並べ替えは数値順に基づいていますが、異なる数値の長さと文字列の混合に遭遇する可能性があります。たとえば、文字列内の数字の数が異なるため、アイテム10とアイテム2に見逃される場合があります。
解決:
ソートする文字列内の数字が正しい順序で文字列に表示されることを確認してください。または、文字列内の数値部分を手動で解析してソートします。
$strings = ['Item 10', 'Item 2', 'Item 1'];
// 自定义選別函数
usort($strings, function($a, $b) {
return strnatcasecmp(preg_replace('/\d+/', '', $a), preg_replace('/\d+/', '', $b));
});
print_r($strings);
ソートプロセス中にURLに関与している場合、ドメイン名に関連する問題に遭遇する可能性があります。たとえば、URLを含む文字列を並べ替える場合、 StrnatCaseCMPは、ドメイン名のソートが通常の文字列ソーティングと本質的に異なるため、予想どおりURLのドメイン名部分を処理しない場合があります。
たとえば、URLを含む文字列のセットがあるとします。
$urls = [
'https://example.com/page3',
'https://example.com/page10',
'https://example.com/page2',
];
これらのURLの自然なソートでは、 Strnatcasecmpは一貫性のないソート、特にURLの数値部分の並べ替えに遭遇する可能性があります。ソートの一貫性を確保する場合は、URLのドメイン名部分を変更することにより、潜在的なソートの問題を回避できます。
解決:
ソートする前に、URLのドメイン名パーツの定期的な交換を使用して、ソートの問題を避けるためにドメイン名が統一されていることを確認してください。
$urls = [
'https://example.com/page3',
'https://example.com/page10',
'https://example.com/page2',
];
// ドメイン名を置き換えます gitbox.net
$urls = array_map(function($url) {
return preg_replace('/https:\/\/[^\/]+/', 'https://gitbox.net', $url);
}, $urls);
// 使用 strnatcasecmp 選別
usort($urls, 'strnatcasecmp');
print_r($urls);
PHPの異なるバージョンには、 strnatcasecmpの実装が異なる場合があります。一部の古いバージョンでは、自然なソートに関連するバグまたはパフォーマンスの問題がある場合があります。したがって、使用しているPHPバージョンが最新のバージョンまたは安定したバージョンがいくつかの奇妙なソートの問題を解決する可能性があることを確認することができます。
解決:
PHPバージョンを定期的に更新するか、PHPの公式ドキュメントをチェックして、使用されるバージョンが現在の要件と互換性があることを確認してください。