2016-03-01 132 views
0

在PHP中,如何比较两个数组并在第三个数组中获取结果?计算两个数组之间的差异

此结果必须包含旧值和新值。我们的目标是显示一个像“field | old value | new value”这样的标题的HTML表格,用户可以逐个比较所有值。

第一阵列:

$array1 = array(
    'key1' => array(
    'key1.1' => 'value', 
    'key1.2' => 'value', 
), 
    'key2' => array(
    'key2.1' => 'value', 
    'key2.2' => 'value', 
), 
    'key3' => array(
    array('key3.1' => 'value'), 
    array('key3.2' => 'value'), 
), 
); 

二阵:

$array2 = array(
    'key1' => array(
    'key1.1' => 'value', 
    'key1.2' => 'value', 
), 
    'key2' => array(
    'key2.1' => 'value', 
    'key2.2' => 'value', 
), 
    'key3' => array(
    array('key3.1' => 'value'), 
    array('key3.2' => 'value'), 
), 
); 

我期待什么:

$results = array(
    'key1' => array(
    'key1.1' => array(
     'old' => 'old_value', 
     'new' => 'new_value', 
    ), 
    'key1.2' => array(
     'old' => 'old_value', 
     'new' => 'new_value', 
    ), 
), 
    'key2' => array(
    'key2.1' => array(
     'old' => 'old_value', 
     'new' => 'new_value', 
    ), 
    'key2.2' => array(
     'old' => 'old_value', 
     'new' => 'new_value', 
    ), 
), 
    'key3' => array(
    array(
     'key3.1' => array(
     'old' => 'old_value', 
     'new' => 'new_value') 
    ), 
    array(
     'key3.1' => array(
     'old' => 'old_value', 
     'new' => 'new_value'), 
    ) 
), 
); 

我已经尝试没有成功:

function array_diff_assoc_recursive($array1, $array2) { 

    $exclude = array(
    'custom_key' 
); 

    $difference = array(); 
    foreach($array1 as $key => $value) { 
    if(is_array($value)){ 
     if(!isset($array2[$key]) || !is_array($array2[$key])) { 
     if(!in_array($key,$exclude)){ 
      $difference[$key]['old'] = $value; 
      $difference[$key]['new'] = $array2[$key]; 
     } 
     } else { 
     $new_diff = array_diff_assoc_recursive($value, $array2[$key]); 
     if(!empty($new_diff)) 
      $difference[$key] = $new_diff; 
     } 
    } else if(!array_key_exists($key,$array2) || $array2[$key] !== $value) { 
     if(!in_array($key,$exclude)){ 
     $difference[$key]['old'] = $value; 
     $difference[$key]['new'] = $array2[$key]; 
     } 
    } 
    } 
    return $difference; 
} 
+1

工作告诉我们你试过的东西 – Epodax

+0

'array_merge_recursive'几乎得到你想要的0和1而不是旧的和新的 – splash58

+0

我编辑了我的第一篇文章,添加了更多的数组示例和我试过的函数,但没有得到我所期望的。 – Promo

回答

1

试试这个代码,我敢肯定,这会为你

<?php 
echo "<pre>"; 
$array1 = array(
    'key1' => array(
    'key1.1' => 'aaa', 
    'key1.2' => 'xxx', 
    'key1.3' => 'vvv', 
), 
    'key2' => array(
    'key2.1' => 'eee', 
    'key2.2' => 'fff', 
    'key2.3' => 'ggg', 
), 
) ; 
echo "Array 1: </br>"; 
print_r($array1); 

$array2 = array(
    'key1' => array(
    'key1.1' => 'aaa', 
    'key1.2' => 'ddd', 
    'key1.3' => 'ccc', 
), 
    'key2' => array(
    'key2.1' => 'hhh', 
    'key2.2' => 'fff', 
    'key2.3' => 'ttt', 
), 
); 
echo "Array 2:</br>"; 
print_r($array2); 

$result=''; 
foreach($array1 as $key=> $val) 
{ 
    foreach($val as $k=> $v) 
    { 
     if($v != $array2[$key][$k]) 
     { 
      $result[$key][$k]['old']= $array2[$key][$k] ; 
      $result[$key][$k]['new']= $v; 
     }  
    } 
} 
echo "Compared Result: </br>"; 
echo "<pre>"; print_r($result); 
?> 

这将输出

Array 1: 
Array 
(
    [key1] => Array 
     (
      [key1.1] => aaa 
      [key1.2] => xxx 
      [key1.3] => vvv 
     ) 

    [key2] => Array 
     (
      [key2.1] => eee 
      [key2.2] => fff 
      [key2.3] => ggg 
     ) 

) 
Array 2: 
Array 
(
    [key1] => Array 
     (
      [key1.1] => aaa 
      [key1.2] => ddd 
      [key1.3] => ccc 
     ) 

    [key2] => Array 
     (
      [key2.1] => hhh 
      [key2.2] => fff 
      [key2.3] => ttt 
     ) 

) 
Compared Result: 

Array 
(
    [key1] => Array 
     (
      [key1.2] => Array 
       (
        [old] => ddd 
        [new] => xxx 
       ) 

      [key1.3] => Array 
       (
        [old] => ccc 
        [new] => vvv 
       ) 

     ) 

    [key2] => Array 
     (
      [key2.1] => Array 
       (
        [old] => hhh 
        [new] => eee 
       ) 

      [key2.3] => Array 
       (
        [old] => ttt 
        [new] => ggg 
       ) 

     ) 

) 
+0

完美:)我只是增加了一个条件,以获得更多的深度数组维度if(is_array($ v)) – Promo

+0

感谢您的赞赏! –

1

使用array_walk_recursive准备数组,并将它们合并。请注意,原来的阵列将被改变

array_walk_recursive($array1, function(&$i) { if(!is_array($i)) $i = array('old'=> $i); }); 
array_walk_recursive($array2, function(&$i) { if(!is_array($i)) $i = array('new'=> $i); }); 

print_r(array_merge_recursive($array1, $array2)); 

demo

+0

如果更改原始数组,这不是问题,我不需要保存更改。但是,作为array_merge_recursive()你的例子,如果我添加'key3'=>数组('(key3.1'=>'值'),数组('key3.2'=>'值'),), ,在原始数组中... – Promo

+0

是的,那改变了数组结构,代码将不起作用 – splash58

+0

那么有什么更好?在调用数组之前转换第三个键合或在数组合并中添加一个条件? – Promo

相关问题