多维数组差异php

kcs*_*ssm 8 php multidimensional-array

我有两个多维数组,我想要区别.例如.我在下面采用了二维两个数组

$array1 = Array (
       [a1] => Array  (
          [a_name] => aaaaa
          [a_value] => aaa
     )

       [b1] => Array (
          [b_name] => bbbbb
          [b_value] => bbb
   )
       [c1] => Array (
          [c_name] => ccccc
          [c_value] => ccc
   )

)

$array2 = Array (
 [b1] => Array (
       [b_name]=> zzzzz
     )
)
Run Code Online (Sandbox Code Playgroud)

现在我想要这两个数组的关键区别.我尝试过array_diff_key()但它不适用于多维.

array_diff_key($array1, $array2)
Run Code Online (Sandbox Code Playgroud)

我希望输出如下

//output
$array1 = Array (
   [a1] => Array  (
      [a_name] => aaaaa
      [a_value] => aaa
 )

   [b1] => Array (          
      [b_value] => bbb
)
   [c1] => Array (
      [c_name] => ccccc
      [c_value] => ccc
)

)
Run Code Online (Sandbox Code Playgroud)

如果您认为我的问题是真的,请接受并回答.谢谢.

编辑

现在,如果第二个数组是

$array2 = Array( [b1] => zzzzz)
Run Code Online (Sandbox Code Playgroud)

结果应该是

$array1 = Array (
   [a1] => Array  (
      [a_name] => aaaaa
      [a_value] => aaa
    )     

   [c1] => Array (
      [c_name] => ccccc
      [c_value] => ccc
     )

)
Run Code Online (Sandbox Code Playgroud)

Zah*_*ass 10

请检查我是否理解正确,然后此代码段可以帮助您解决问题.我已经针对您指定的问题对其进行了测试.如果还有其他要运行它的测试用例,可以告诉我调整代码.

$a1 = array(
    'a1' => array('a_name' => 'aaa', 'a_value' => 'aaaaa'),
    'b1' => array('b_name' => 'bbb', 'b_value' => 'bbbbbb'),
    'c1' => array('c_name' => 'ccc', 'c_value' => 'cccccc')
);

$a2 = array(
    'b1' => array('b_name' => 'zzzzz'),
);

$result = check_diff_multi($a1, $a2);
print '<pre>';
print_r($result);
print '</pre>';


function check_diff_multi($array1, $array2){
    $result = array();
    foreach($array1 as $key => $val) {
         if(isset($array2[$key])){
           if(is_array($val) && $array2[$key]){
               $result[$key] = check_diff_multi($val, $array2[$key]);
           }
       } else {
           $result[$key] = $val;
       }
    }

    return $result;
}
Run Code Online (Sandbox Code Playgroud)

编辑:添加调整代码.


小智 7

这个解决方案对我非常有帮助,希望无论阵列如何混乱,他们都能提供帮助。

function your_array_diff($arraya, $arrayb) {

    foreach ($arraya as $keya => $valuea) {
        if (in_array($valuea, $arrayb)) {
            unset($arraya[$keya]);
        }
    }
    return $arraya;
}

$a1 = Array
    (
    "0" => Array
        (
        "Empresa" => "TMC01",
        "Paga" => "13/01/2015",
        "ID" => "M2",
        "Valor" => "200",
        "Nombre" => "BONI"
    ),

    "1" => Array
        (
        "Empresa" => "TMC01",
        "Paga" => "13/01/2015",
        "ID" => "M1",
        "Valor" => "100",
        "Nombre" => "SUELDO"
    )
);

$b1 = Array
    (
    "0" => Array
        (
        "Empresa" => "TMC01",
        "Paga" => "13/01/2015",
        "ID" => "M1",
        "Valor" => "100",
        "Nombre" => "SUELDO"
    ),
    "1" => Array
        (
        "Empresa" => "TMC01",
        "Paga" => "13/01/2015",
        "ID" => "M2",
        "Valor" => "200",
        "Nombre" => "BONI"
    )
);

$resultado = your_array_diff($a1, $b1);

echo "<pre>";
echo print_r($resultado);
echo "</pre>";
Run Code Online (Sandbox Code Playgroud)


ber*_*rdh 5

在很多情况下,原始答案无法正常工作,因此我写了一个更好的解决方案。问题之一是,如果删除数组2中的属性,其他函数将无法识别该属性。

function check_diff_multi($array1, $array2){
    $result = array();

    foreach($array1 as $key => $val) {
        if(is_array($val) && isset($array2[$key])) {
            $tmp = check_diff_multi($val, $array2[$key]);
            if($tmp) {
                $result[$key] = $tmp;
            }
        }
        elseif(!isset($array2[$key])) {
            $result[$key] = null;
        }
        elseif($val !== $array2[$key]) {
            $result[$key] = $array2[$key];
        }

        if(isset($array2[$key])) {
            unset($array2[$key]);
        }
    }

    $result = array_merge($result, $array2);

    return $result;
}
Run Code Online (Sandbox Code Playgroud)

我还添加了测试用例以检查结果:

如您所见,我的功能可以提供更好的结果。