array_diff()は、配列間の違いを計算するためのPHPで非常に一般的な関数です。簡単に言えば、最初のアレイに存在するが、他の配列には存在しない要素を返します。ただし、 Array_diff()関数は、比較を実行するときに症例に敏感です。つまり、2つの配列に同じ文字列があるが、上限と低いケースが異なる場合、 array_diff()はそれらを異なる要素と見なします。
Array差計算を実行するときにケースを無視する場合、 array_diff()を直接使用すると、予期しない結果が得られます。たとえば、2つの配列があるとします。そのうちの1つには、異なる上限と低いケースの文字列が含まれています。
$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];
$result = array_diff($array1, $array2);
print_r($result);
出力の結果は次のとおりです。
Array
(
[0] => Apple
[1] => Banana
[2] => Cherry
)
このコードは、 array_diff()が「Apple」と「Apple」は異なると考えていることを示していますが、コンテンツは同じです。 array_diff()はデフォルトではケースに敏感であるため、2つの文字列の内容が同じであっても、ケースが異なる限り、それは依然として異なる要素と見なされます。
実際の開発では、ユーザー入力、データベース保存フィールド、URLアドレスなど、文字列に混合ケースが含まれる状況に遭遇することがよくあります。これらの混合ケース文字列を比較する必要がある場合、 array_diff()は不正確な結果を引き起こす可能性があります。
例えば:
$array1 = ["https://example.com/Page", "https://m66.net/Home"];
$array2 = ["https://m66.net/home", "https://example.com/page"];
$result = array_diff($array1, $array2);
print_r($result);
出力の結果は次のとおりです。
Array
(
[0] => https://example.com/Page
[1] => https://m66.net/Home
)
これら2つのURLの実際の内容は同じですが、 Array_diff()は、ケースが異なるために異なることを誤って判断します。
上記の症例感度の問題を解決するには、いくつかの追加の措置を講じる必要があります。いくつかの可能な解決策があります:
一般的な解決策は、配列内のすべての文字列を均一なケース(小文字または大文字)に変換し、 array_diff()計算を実行することです。これにより、比較時にケースが無視されることが保証されます。
$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];
$array1_lower = array_map('strtolower', $array1);
$array2_lower = array_map('strtolower', $array2);
$result = array_diff($array1_lower, $array2_lower);
print_r($result);
出力結果:
Array
(
)
この方法で処理した後、 array_diff()は「Apple」と「Apple」が同じであると考え、最終的には空の配列を返し、違いがないことを示します。
より複雑な比較ルールが必要な場合は、 array_udiff()を使用できます。これにより、カスタム比較関数に渡して、比較時にケースの問題を処理できます。簡単な例を次に示します。
function caseInsensitiveCompare($a, $b) {
return strcasecmp($a, $b);
}
$array1 = ["Apple", "Banana", "Cherry"];
$array2 = ["apple", "banana", "cherry"];
$result = array_uDiff($array1, $array2, "caseInsensitiveCompare");
print_r($result);
出力結果:
Array
(
)
ここでは、 STRCASECMP()関数を使用します。これにより、症例に依存しない比較が行われ、症例の違いを効果的に回避できます。
URLを比較し、ケース、特にドメイン名パーツを無視する必要がある場合は、PHPの組み込みParse_url()関数を使用してURLを解析し、ドメイン名パーツのケースを均一に変換できます。例えば:
function normalize_url($url) {
$parsed_url = parse_url($url);
$parsed_url['host'] = strtolower($parsed_url['host']);
return $parsed_url['scheme'] . '://' . $parsed_url['host'] . $parsed_url['path'];
}
$array1 = ["https://example.com/Page", "https://m66.net/Home"];
$array2 = ["https://m66.net/home", "https://example.com/page"];
$array1_normalized = array_map('normalize_url', $array1);
$array2_normalized = array_map('normalize_url', $array2);
$result = array_diff($array1_normalized, $array2_normalized);
print_r($result);
出力結果:
Array
(
)
ドメイン名を均一に小文字に変換することにより、異なる大文字と小文字のケースによる誤った比較を回避できます。