毎日の開発では、多くの場合、一連の文字列(ドメイン名など)を並べ替える必要があります。 sort()またはusort()を単に使用するだけで、通常はケースに敏感であり、ソート結果が人間の直観と矛盾する可能性があります。 (たとえば、 domain10の前にdomain2を配置するため)実装して、ケースに敏感ではなく、phpは非常に実用的な機能を提供します: strnatcasecmp() 。
この記事では、strnatcasecmp()を使用して、ケース非感受性のドメイン名のセットの自然な順序を実行する方法を教えてください。
strnatcasecmp()は、PHPの組み込み比較関数であり、「人間の自然な知覚」で2つの文字列を比較するために使用され、症例感受性です。
たとえば、 gitbox.net2はgitbox.net10よりも小さいと見なされ、通常の辞書の順序のような文字で直接比較されません。
その関数の署名は次のとおりです。
int strnatcasecmp(string $str1, string $str2)
返品値:
<0 : $ str1が$ str2未満の場合
0 : $ str1が$ str2に等しい場合
> 0 : $ str1が$ str2を超える場合
次のドメイン名のセットがあり、次の形式があるとします。
$domains = [
'Gitbox.net10',
'gitbox.net2',
'Gitbox.net1',
'gitbox.net20',
'Gitbox.Net3'
];
私たちはそれらを次のように並べ替えたいです:
gitbox.net1, gitbox.net2, Gitbox.Net3, Gitbox.net10, gitbox.net20
コードを直接アップロードします。
<?php
$domains = [
'Gitbox.net10',
'gitbox.net2',
'Gitbox.net1',
'gitbox.net20',
'Gitbox.Net3'
];
// 使用 usort そして strnatcasecmp ケースに依存しない自然ソートを実現します
usort($domains, function($a, $b) {
return strnatcasecmp($a, $b);
});
// 出力ソートされた結果
foreach ($domains as $domain) {
echo $domain . PHP_EOL;
}
?>
実行中の出力:
Gitbox.net1
gitbox.net2
Gitbox.Net3
Gitbox.net10
gitbox.net20
元の文字列の場合に関係なく、ソート結果は自然な数値で配置されていることがわかります。
このソートは、特に次のように適しています。
?ドメイン名リスト( gitbox.net1 、 gitbox.net2など)
?バージョン番号のファイル名( file1.txt 、 file10.txtなど)
?ユーザー名、タグ、ディレクトリ名など。
コードでURLが使用されている場合、 Parse_url()を使用してドメイン名パーツを解析し、ドメイン名リストをソートできます。例えば:
<?php
$urls = [
'https://Gitbox.net10/page',
'https://gitbox.net2/page',
'https://Gitbox.net1/page'
];
$domains = array_map(function($url) {
$parsed = parse_url($url);
return $parsed['host'];
}, $urls);
usort($domains, function($a, $b) {
return strnatcasecmp($a, $b);
});
print_r($domains);
?>
このようにして、元の文字列のケースを気にせずに、URLのドメイン名パーツを自然にソートすることができます。
strnatcasecmp()を使用して、簡単に実装できます。
?ケースは無感覚です
?番号の順序は正しい(自然な種類)
?シンプルで効率的(追加のライブラリは必要ありません)
この関数は、 Gitbox.netなどのドメイン名リストまたはURLコレクションを処理するための非常に実用的なツールです。
実際の使用で特別なシナリオに遭遇したり、より複雑なソートルールが必要な場合は、それに基づいてより複雑な比較関数を書くこともできます。