現在の位置: ホーム> 最新記事一覧> array_diff()を使用する場合、ケースの問題を無視します

array_diff()を使用する場合、ケースの問題を無視します

M66 2025-05-14

array_diff()は、配列間の違いを計算するためのPHPで非常に一般的な関数です。簡単に言えば、最初のアレイに存在するが、他の配列には存在しない要素を返します。ただし、 Array_diff()関数は、比較を実行するときに症例に敏感です。つまり、2つの配列に同じ文字列があるが、上限と低いケースが異なる場合、 array_diff()はそれらを異なる要素と見なします。

1。array_diff ()を使用するときに発生する可能性のある問題

1.1文字列を比較する場合のケースの問題

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つの文字列の内容が同じであっても、ケースが異なる限り、それは依然として異なる要素と見なされます。

大文字と小文字に影響する1.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()は、ケースが異なるために異なることを誤って判断します。

2。これらの問題を回避する方法は?

上記の症例感度の問題を解決するには、いくつかの追加の措置を講じる必要があります。いくつかの可能な解決策があります:

2.1すべての配列要素を小文字(または大文字)に変換する

一般的な解決策は、配列内のすべての文字列を均一なケース(小文字または大文字)に変換し、 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」が同じであると考え、最終的には空の配列を返し、違いがないことを示します。

2.2カスタム比較関数の使用

より複雑な比較ルールが必要な場合は、 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()関数を使用します。これにより、症例に依存しない比較が行われ、症例の違いを効果的に回避できます。

2.3 URLを処理するときの統一ケース

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
(
)

ドメイン名を均一に小文字に変換することにより、異なる大文字と小文字のケースによる誤った比較を回避できます。