PHPでは、 array_intersect_uassoc関数を使用して2つの配列のキーと値を比較し、キー価値のペアが2つのアレイで同じである部分を返します。 array_intersect_assocと違うのは、 array_intersect_uassocを使用すると、ユーザーがキーの比較関数をカスタマイズできることです。
関数は次のように定義されています。
array_intersect_uassoc(array $array1, array $array2, callable $key_compare_func): array
$ array1と$ array2は、比較に参加する2つの配列です。
$ key_compare_funcは、キーを比較するためのユーザー定義関数であり、返品値はstrcmpに似ています。
配列のキー値のペアの順序が一貫していない場合、 array_intersect_uassocは、キーと値の対応する関係に基づいて引き続き比較されます。つまり、キーと値は、アレイでの順序に関係なく、結果に表示されるために「等しい」必要があります。
例えば:
<?php
$array1 = [
'a' => 1,
'b' => 2,
];
$array2 = [
'b' => 2,
'a' => 1,
];
$result = array_intersect_uassoc($array1, $array2, 'strcmp');
print_r($result);
出力:
Array
(
[a] => 1
[b] => 2
)
$ array2のキー価値ペアの順序が$ array1とは異なる場合でも、結果にはすべての一致するキー価値ペアが含まれています。
カスタム比較関数が注文に敏感であると仮定すると、一致する障害を引き起こす可能性があります。デフォルトの文字列比較関数STRCMPは順序に依存しませんが、作成した比較関数に順序またはその他の条件が含まれている場合、結果は異なる場合があります。
キー価値のペアが異なる注文であっても正しく一致していることを確認したい場合は、次の提案に従うことができます。
比較関数がキー自体の値のみを比較し、順次関連ロジックをもたらさないことを確認してください。
最初に配列のキーを並べ替えてから、順序の違いの影響を回避するために、 array_intersect_uassocを使用して比較します。
例:最初にソートしてから比較します
<?php
$array1 = [
'b' => 2,
'a' => 1,
];
$array2 = [
'a' => 1,
'b' => 2,
];
// キーを並べ替えます
ksort($array1);
ksort($array2);
$result = array_intersect_uassoc($array1, $array2, 'strcmp');
print_r($result);
このようにして、初期順序が異なる場合でも、順序の違いの予期しない結果を回避すると、並べ替え後に順序が一貫しています。
array_intersect_uassocはキーと値を比較し、順序自体は一致する結果に影響しません。
カスタムキー比較関数は、順次関連するロジックを含めることを避ける必要があります。
安全な側にいるために、 ksort()を使用して、最初に比較に参加する配列を並べ替えて、均一な順序を確保することができます。
<?php
$array1 = [
'b' => 2,
'a' => 1,
];
$array2 = [
'a' => 1,
'b' => 2,
];
ksort($array1);
ksort($array2);
$result = array_intersect_uassoc($array1, $array2, 'strcmp');
print_r($result);