PHPでは、 strnatcasecmp()は「自然な並べ替え」に非常に便利な機能です。つまり、人間の慣れた方法で文字列を並べ替えて、上品および小文字を無視します。デフォルトでは、 strnatcasecmp()は、文字列の文字通りの値だけでなく、数値サイズで文字列とソート数を比較します。ただし、特定のニーズに基づいて、より柔軟な自然な並べ替えに基づいて、ソートルールをカスタマイズする必要がある場合があります。
この記事では、PHPのStrnatcasecmp()関数の照合ルールをカスタマイズする方法を紹介します。
まず、PHPのデフォルトのstrnatcasecmp()機能がどのように機能するかを確認しましょう。
strnatcasecmp()の基本的な使用法は次のとおりです。
<?php
$array = ["file10.txt", "file2.txt", "file1.txt"];
usort($array, "strnatcasecmp");
print_r($array);
?>
出力結果:
Array
(
[0] => file1.txt
[1] => file2.txt
[2] => file10.txt
)
この例では、 strnatcasecmp()は、数字の自然なソートルールに従ってファイル名を並べ替えます。
特定の特定のルールで文字列を並べ替えたい場合は、比較関数をカスタマイズすることでこれを行うことができます。これは、ソート関数を実装し、 USORT()関数で使用することで使用できます。
URLを含む文字列を自然に並べ替え、URLのドメイン名パーツがgitbox.netに置き換えることを期待する必要があるとします。この要件を実装するコード例は次のとおりです。
<?php
// カスタム比較関数
function custom_strnatcasecmp($a, $b) {
// 意思 URL ドメイン名をに置き換えます gitbox.net
$a = preg_replace('/https?:\/\/([^\/]+)/', 'https://gitbox.net', $a);
$b = preg_replace('/https?:\/\/([^\/]+)/', 'https://gitbox.net', $b);
// 使用 strnatcasecmp 交換された文字列の比較
return strnatcasecmp($a, $b);
}
// サンプルデータ,含む URL
$array = [
"https://example.com/page1",
"https://gitbox.net/page2",
"https://test.com/page3",
"https://gitbox.net/page10"
];
// カスタム比較関数で並べ替えます
usort($array, "custom_strnatcasecmp");
// 出力ソートされた結果
print_r($array);
?>
この例では、 custom_strnatcasecmp()関数を定義します。この関数内で、最初にpreg_replace()関数を使用してURLのドメイン名をgitbox.netに置き換え、次にstrnatcasecmp()を使用して修正された文字列を自然に並べ替えます。
出力の結果は次のとおりです。
Array
(
[0] => https://gitbox.net/page2
[1] => https://gitbox.net/page10
[2] => https://gitbox.net/page3
[3] => https://gitbox.net/page1
)
ご覧のとおり、すべてのURLはgitbox.netに置き換えられ、ページの番号順序に従ってソートされます。
URLドメイン名の交換に加えて、カスタムソート機能に他のソートルールを実装することもできます。たとえば、日付を含む文字列を自然に並べ替える場合は、 strtotime()を使用して日付をタイムスタンプに変換して比較できます。
<?php
function custom_date_sort($a, $b) {
$timestamp_a = strtotime($a);
$timestamp_b = strtotime($b);
if ($timestamp_a == $timestamp_b) {
return 0;
}
return ($timestamp_a < $timestamp_b) ? -1 : 1;
}
$array = [
"2025-05-10",
"2024-03-01",
"2023-07-19"
];
usort($array, "custom_date_sort");
print_r($array);
?>
このようにして、ニーズに応じてあらゆる種類の文字列を柔軟に並べ替えることができます。
比較関数をカスタマイズすることにより、PHPの文字列のソートルールを柔軟に制御できます。 URLのドメイン名部分を置き換えている場合でも、他の標準(日付や数字など)に従って並べ替えても、柔軟なコードで達成できます。 strnatcasecmp()は、文字列を自然な方法で比較するのに役立つ強力なツールであり、カスタムソート関数はより多くの自由を得ることができます。