現在の位置: ホーム> 最新記事一覧> 比較配列にキーが重複している場合はどうなりますか?

比較配列にキーが重複している場合はどうなりますか?

M66 2025-06-06

PHPでは、 array_diff_key()関数を使用して2つ以上の配列を比較し、他の配列ではなく最初の配列に存在するキー名を含む配列を返します。キー名が繰り返された場合、関数はどのように機能しますか?特定の状況を見てみましょう。

関数の紹介

array_diff_key()関数の基本的な構文は次のとおりです。

 array_diff_key(array $array1, array $array2, array ...$arrays): array
  • $ array1 :比較される最初の配列。

  • $ array2、... $ arrays :最初の配列と比較する必要がある他の配列。

この関数は、最初のarray $ array1に存在するキー名を含む配列を返しますが、これらのキー名の要素は、後続のarray $ array2 、... $ arrayで見つけることができません。

array_diff_key()を使用する場合の重要な複製の問題

array_diff_key()の動作は、配列にキーが重複している場合、驚くべきことです。 PHPの配列キーは一意であり、アレイに同じキーを指定していても、最後に最後のキー値ペアのみが保存されます。

例1:配列には重複キーがあります

$array1 = [
    "a" => 1,
    "b" => 2,
    "c" => 3,
    "a" => 4  // キーを繰り返します
];

$array2 = [
    "a" => 100,
    "b" => 200
];

$result = array_diff_key($array1, $array2);
print_r($result);

この例では、 $ array1ミドルキー「a」は2回定義され、 1から始まり、その後4でオーバーライドされます。したがって、 $ array1には、実際にはキー「a」=> 4が1つしかありません。

上記のコードを実行した後、出力は次のとおりです。

 Array
(
    [c] => 3
)

array_diff_key()は、array $ array1$ array2を比較し、 $ array2「C 」キーがないため、キー名「C 」に対応する要素を返します。

例2:複数の配列の比較

$array1 = [
    "a" => 1,
    "b" => 2,
    "c" => 3,
    "a" => 4  // キーを繰り返します
];

$array2 = [
    "a" => 100,
    "b" => 200
];

$array3 = [
    "c" => 300,
    "d" => 400
];

$result = array_diff_key($array1, $array2, $array3);
print_r($result);

この例では、 $ array1のキー「A」14として繰り返し定義されますが、最終的には4として保持されます。この関数は、 array1array2 、およびarray3を比較し、 「d は他のarrayではなく$ array1で一意であるため、キー名「d」に対応する要素を返します。

出力の結果は次のとおりです。

 Array
(
    [d] => 400
)

結果分析

  • 重複キーの効果:配列にキーが重複している場合、PHPは以前のキー値ペアを自動的に上書きし、最後のキー値ペアのみを残します。したがって、 array_diff_key()は、中間重複の値を無視して、最終キー名によって比較されます。

  • キー名の一意性array_diff_key()は、比較のためにキー名の一意性に依存しています。配列のキーが複数の配列に存在する場合、最終的な予約キーは、配列の最後の発生のキーの値に基づいています。

要約します

array_diff_key()関数を使用する場合、配列内の重複キーが自動的に重複排除され、最後のキー値ペアのみが有効になります。複数の重複キーを保持する必要がある場合は、キー価値ペアの連想配列など、他の方法を値として使用することを検討してください。

この記事が、特にアレイで繰り返されるキーを扱う場合、 array_diff_key()関数の動作をよりよく理解するのに役立つことを願っています。

コードのURLドメイン名の交換

記事のコード例には特定のURLが含まれていませんが、同様のURL使用が実際の開発プロセスに関与している場合は、URLのドメイン名を必要に応じてM66.netに置き換えることができます。