繁体   English   中英

如何在PHP中求出两个不同大小和层次的多维arrays的区别

[英]How to find the difference between two multidimensional arrays with different sizes and levels in PHP

我在 php 中有两个不同大小和级别的多维 arrays。 我需要在第二个数组中找到第一个数组中没有的元素。

数组 A:

$bmw_a = array(
    "3 series" => array(),
    "5 series" => array(
        "520D" => array(
            "N47_163" => array(),
        ),
        "530i" => array(),
    ),
    "7 series" => array(),
);

数组 B:

$bmw_b = array(
    "1 series" => array(),
    "3 series" => array(),
    "5 series" => array(
        "520D" => array(
            "N47_163" => array(),
            "M47_177" => array()
        ),
        "530i" => array(
            "M54_228" => array(),
            "N52_255" => array()
        ),
    ),
    "7 series" => array(),
);

我需要 output 看起来像这样:

$output = array(
    "1 series" => array(),
    "5 series" => array(
        "520D" => array(
            "M47_177" => array()
        ),
        "530i" => array(
            "M54_228" => array(),
            "N52_255" => array()
        )
    )
);

我尝试了array_diffarray_diff_assoc ,但没有一个有效。

array_diff_assoc()仅适用于一个级别,因此对于多维 arrays 您需要递归。

这里是:

<?php

$bmw_a = array(
    "3 series" => array(),
    "5 series" => array(
        "520D" => array(
            "N47_163" => array(),
        ),
        "530i" => array(),
    ),
    "7 series" => array(),
);

$bmw_b = array(
    "1 series" => array(),
    "3 series" => array(),
    "5 series" => array(
        "520D" => array(
            "N47_163" => array(),
            "M47_177" => array()
        ),
        "530i" => array(
            "M54_228" => array(),
            "N52_255" => array()
        ),
    ),
    "7 series" => array(),
);

$result = array_diff_assoc_recursive($bmw_b, $bmw_a);

echo '<pre>';
var_dump($result);

function array_diff_assoc_recursive($array1, $array2) {
    $diff = array();
    foreach ($array1 as $key => $value) {
        if (is_array($value)) {
            if (!isset($array2[$key]) || !is_array($array2[$key])) {
                $diff[$key] = $value;
            } else {
                $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                if (!empty($new_diff)) {
                    $diff[$key] = $new_diff;
                }
            }
        } elseif (!isset($array2[$key]) || $array2[$key] != $value) {
            $diff[$key] = $value;
        }
    }
    return $diff;
}

Output:

array(2) {
  ["1 series"]=>
  array(0) {
  }
  ["5 series"]=>
  array(2) {
    ["520D"]=>
    array(1) {
      ["M47_177"]=>
      array(0) {
      }
    }
    ["530i"]=>
    array(2) {
      ["M54_228"]=>
      array(0) {
      }
      ["N52_255"]=>
      array(0) {
      }
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM