2015-02-11 164 views
0

之间差I有两个阵列等PHP:获取2个多维数组

$a1= array(
     array('a'=>1,'b'=>2, 'c'=>3), // similar to $a2[0] 
     array('a'=>3,'b'=>4, 'c'=>5), // similar to $a2[1] 
     array('a'=>9,'b'=>6, 'c'=>9) 
); 
$a2= array(
     array('a'=>1,'b'=>2, 'c'=>3), 
     array('a'=>3,'b'=>4, 'c'=>5), 
     array('a'=>5,'b'=>6, 'c'=>7), 
     array('a'=>11,'b'=>4, 'c'=>13), 
     array('a'=>14,'b'=>6, 'c'=>3) 
); 

我想要得到的阵列,其具有简化版,像

$arrayResult= array(
     array('a'=>9,'b'=>6, 'c'=>9),// from $a1[3] 
     array('a'=>5,'b'=>6, 'c'=>7),// from $a2[2] 
     array('a'=>11,'b'=>4, 'c'=>13),// from $a2[3] 
     array('a'=>14,'b'=>6, 'c'=>3)// from $a2[4] 
); 

我试图array_udiff常见值,并且还单独的功能,但我无法得到正确的东西。

+0

你array_udiff使用什么回调函数? – 2015-02-11 09:59:46

回答

0

嗯快速的解决方案,而不是优化

$result = array(); 
foreach($a1 as $va1) { 
    $found = false; 
    foreach($a2 as $va2) { 
     $x = array_diff($va1, $va2); 
     if (empty($x)) { 
     $found = true; 
     } 
    } 
    if (!$found) { 
     $result[] = $va1; 
    } 
} 

foreach($a2 as $va2) { 
    $found = false; 
    foreach($a1 as $va1) { 
     $x = array_diff($va2, $va1); 
     if (empty($x)) { 
     $found = true; 
     } 
    } 
    if (!$found) { 
     $result[] = $va2; 
    } 
} 

var_dump($result); 

编辑:有点优化(即前被发现unseting值):

$a1= array(
     array('a'=>1,'b'=>2, 'c'=>3), // similar to $a2[0] 
     array('a'=>3,'b'=>4, 'c'=>5), // similar to $a2[1] 
     array('a'=>9,'b'=>6, 'c'=>9) 
); 
$a2= array(
     array('a'=>1,'b'=>2, 'c'=>3), 
     array('a'=>3,'b'=>4, 'c'=>5), 
     array('a'=>5,'b'=>6, 'c'=>7), 
     array('a'=>11,'b'=>4, 'c'=>13), 
     array('a'=>14,'b'=>6, 'c'=>3) 
); 
$i=0; 
$result = array(); 
    foreach($a1 as $ka1 => $va1) { 
     $found = false; 
     foreach($a2 as $ka2 => $va2) { 
      $i++; 
      $x = array_diff($va1, $va2); 
      if (empty($x)) { 
      $found = true; 
      unset($a2[$ka2], $a1[$ka1]); 
      } 
     } 
     if (!$found) { 
      $result[] = $va1; 
     } 
    } 
    foreach($a2 as $ka2 => $va2) { 
    $found = false; 
    foreach($a1 as $ka1 => $va1) { 
     $i++; 
     $x = array_diff($va2, $va1); 
     if (empty($x)) { 
     unset($a2[$ka2], $a1[$ka1]); 
     $found = true; 
     } 
    } 
    if (!$found) { 
     $result[] = $va2; 
    } 
} 

var_dump($result);echo $i; 
+0

如果以你的方式对此进行优化,这将非常棒。 – 2015-02-11 10:16:43

+0

@AmmarHayderKhan我对它进行了一些优化 – szapio 2015-02-11 10:27:05

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

    return $result; 
} 

//call this function 
check_diff_multi($a1,$a2);