2016-03-01 53 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

相關問題