2013-03-18 150 views
1

是否有函數比較2個不同的關聯數組,並返回更改?比較2個數組

例如

$age = array("Peter"=>"35","Ben"=>"37","Joe"=>""); 
$age2 = array("Peter"=>"38","Ben"=>"37","Joe"=>"43"); 

回報

$return = array(
    "Peter"=>"Changed from 35 to 38", 
    "Joe"=>"Changed from blank to 43" 
); 
+3

沒有返回喜歡你想要的結果。 – Pitchinnate 2013-03-18 15:29:09

回答

2

正如前面所指出的,array_diff_assoc是你的出發點。其餘的正在建設的字符串每個區別:

function compareAge($age, $age2) 
{ 
    $return = array(); 
    foreach(array_keys(array_diff_assoc($age, $age2)) as $diffKey) { 
     $from = empty($age[$diffKey]) ? 'blank' : $age[$diffKey]; 
     $to = empty($age2[$diffKey]) ? 'blank' : $age2[$diffKey]; 
     $return[$diffKey] = "Changed from {$from} to {$to}"; 
    } 
    return $return; 
} 

working demo

+0

這很好,有沒有一種方法來包括名稱以及前。 「喬從20變爲空」? – kajab 2013-03-18 15:55:54

+0

在循環中,「Joe」將在'$ diffKey'中,所以:是。 – 2013-03-18 16:01:51

5

array_diff可以在正確的道路上開始你。儘管它沒有提供你正在尋找的確切輸出,但它會顯示兩個數組之間的差異。

正如標記指出的那樣,array_diff_assoc可能更有幫助,因爲它維護數組索引。

+1

array_diff_assoc()可能更有用 – 2013-03-18 15:32:34

1

沒有默認情況下,我有我的手一段時間:) http://codepad.org/2UtrPE3o

<? 
$age = array("Peter"=>"35","Ben"=>"37","Joe"=>""); 
$age2 = array("Peter"=>"38","Ben"=>"37","Joe"=>"43"); 

$result = array(); 
foreach($age as $key=>$val) { 
    if (array_key_exists($key, $age2)) { 
    if ($val!==$age2[$key]) 
     $result[$key] = 'Changed from '.(empty($val)?'blank':$val).' to '. (empty($age2[$key])?'blank':$age2[$key]); 
    } else { 
    $result[$key] = 'Changed from '.(empty($val)?'blank':$val).' to blank'; 
    } 
} 

foreach($age2 as $key=>$val) { 
    if (!array_key_exists($key, $age)) { 
    $result[$key] = 'Changed from blank to ' . $val; 
    } 
} 

var_dump($result); 
?> 
0

檢查這一點,更有效的解決方案:

$age1 = array("Peter"=>"35","Ben"=>"37","Joe"=>""); 
$age2 = array("Peter"=>"38","Ben"=>"37","Joe"=>"43"); 

$result = array_diff_assoc($age1, $age2); 

$res = array(); 
foreach($result as $key=>$val){ 
    $res[$key] = "Changed from ".($val?$val:"Balnk")." to ".($age2[$key]?$age2[$key]:"blank"); 
} 

echo "<pre>"; 
print_r($res);