ホームページ > バックエンド開発 > PHPの問題 > PHP の多次元配列の比較は異なります

PHP の多次元配列の比較は異なります

PHPz
リリース: 2023-05-22 21:31:06
オリジナル
613 人が閲覧しました

PHP では、多次元配列は非常に一般的なデータ構造であり、いくつかの複雑なデータ関係を簡単に表現できます。しかし、実際の開発では、2 つの多次元配列の違いを比較しなければならないことが多く、これは非常に困難な作業です。この記事では、PHP を使用して 2 つの多次元配列を比較し、それらの違いを見つける方法について説明します。

便宜上、最初に 2 つの多次元配列、つまり $arr1 と $arr2 を定義します。サンプル コードを以下に示します。

$arr1 = array(
    'name' => 'Tom',
    'age' => 20,
    'address' => array(
        'city' => 'Beijing',
        'region' => 'Haidian',
    ),
    'contact' => array(
        'phone' => '123456',
        'email' => 'tom@example.com',
    ),
);

$arr2 = array(
    'name' => 'Jerry',
    'age' => 22,
    'address' => array(
        'city' => 'Beijing',
        'region' => 'Chaoyang',
    ),
    'contact' => array(
        'phone' => '789012',
        'email' => 'jerry@example.com',
    ),
);
ログイン後にコピー

上記のコードでは、$arr1 と $arr2 の両方に、同じキーと値のペアと異なるキーと値のペアが含まれており、キーと値のペアの一部の値も配列。これら 2 つの配列を比較し、それらの差を出力したいとします。

まず、array_diff_assoc() 関数を使用して 2 つの配列間の違いを比較できます。この関数は、$arr1 には存在するが $arr2 には存在しないキーと値のペアとその値を返します。コードは次のとおりです:

$diff1 = array_diff_assoc($arr1, $arr2);
print_r($diff1);
ログイン後にコピー

出力は次のとおりです:

Array
(
    [name] => Tom
    [age] => 20
    [address] => Array
        (
            [region] => Haidian
        )

    [contact] => Array
        (
            [phone] => 123456
            [email] => tom@example.com
        )

)
ログイン後にコピー
ログイン後にコピー

ご覧のとおり、$diff1 には、$arr1 には存在するが $arr2 には存在しないキーと値のペアが含まれています。彼らの価値観も。このうち、「name」キーに対応する値は「Tom」、「age」キーに対応する値は20、「address」キーに対応する値は「region」キーと値のペアを含む配列です。 、および「contact」キーに対応する値 Value も配列です。

次に、再帰関数を使用して、配列を含む $arr1 と $arr2 内のすべてのキーと値のペア間の違いを比較します。コードは次のとおりです。

function compareArray($arr1, $arr2) {
    $diff = array();
    foreach ($arr1 as $key => $val1) {
        if (is_array($val1) && isset($arr2[$key]) && is_array($arr2[$key])) {
            $diff[$key] = compareArray($val1, $arr2[$key]);
        } elseif (!isset($arr2[$key]) || $arr2[$key] !== $val1) {
            $diff[$key] = $val1;
        }
    }
    foreach ($arr2 as $key => $val2) {
        if (is_array($val2) && (!isset($arr1[$key]) || !is_array($arr1[$key]))) {
            $diff[$key] = $val2;
        }
    }
    return $diff;
}

$diff2 = compareArray($arr1, $arr2);
print_r($diff2);
ログイン後にコピー

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

Array
(
    [name] => Tom
    [age] => 20
    [address] => Array
        (
            [region] => Haidian
        )

    [contact] => Array
        (
            [phone] => 123456
            [email] => tom@example.com
        )

)
ログイン後にコピー
ログイン後にコピー

ご覧のとおり、$diff2 は、$arr1 と $ の配列を含むすべてのキーと値のペアの差を出力します。 ar2.このうち、「name」キーに対応する値は「Tom」、「age」キーに対応する値は20、「address」キーに対応する値は「region」キーと値のペアを含む配列です。 、および「contact」キーに対応する値 Value も配列です。

最後に、$diff1 と $diff2 を比較して、それらがどのように似ているか、どのように異なるかを判断できます。コードは次のとおりです:

$intersection = array_intersect_assoc($diff1, $diff2);
$difference = array_merge($diff1, $diff2);
$difference = array_diff_key($difference, $intersection);

echo "intersection:
";
print_r($intersection);
echo "difference:
";
print_r($difference);
ログイン後にコピー

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

intersection:
Array
(
    [name] => Tom
    [age] => 20
    [address] => Array
        (
            [region] => Haidian
        )

    [contact] => Array
        (
            [phone] => 123456
            [email] => tom@example.com
        )

)
difference:
Array
(
    [name] => Jerry
    [age] => 22
    [address] => Array
        (
            [region] => Chaoyang
        )

    [contact] => Array
        (
            [phone] => 789012
            [email] => jerry@example.com
        )

)
ログイン後にコピー

ご覧のとおり、$intersection には $diff1 と $diff2 の両方に存在するキーと値のペアが含まれています。 $arr1 と $arr2 は同じキーと値のペアです。 $diffference には、$diff1 と $diff2 に存在する異なるキーと値のペアが含まれます。

要約すると、PHP の array_diff_assoc() 関数と再帰関数を使用して、2 つの多次元配列を比較し、それらの違いを見つけることができます。この方法は比較的複雑ですが、非常に実用的であり、実際の開発で広く使用できます。

以上がPHP の多次元配列の比較は異なりますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート