2013-05-02 67 views
0

我有2列:找到兩個數組的差和打印雙向改變PHP

$oldValues = array(125 => 'hello', 126 => 'bye', 131 => 'hi', 141 => ''); 
$newValues = array(125 => 'hello world', 126 => 'bye', 131 => 'h', 141 => 'ABC'); 

現在來解釋這個好一點,$oldValues持有價值用戶更改網站上的任何數據之前。 $newValues保存用戶保存更改後的新值。

多個用戶在同一時間訪問該頁面,所以如果一個用戶didnt刷新頁面,進行任何更改,並點擊保存我希望能夠以顯示"Hey someone else has updated this settings before you did, wanna see the changes?"和他們能夠看到下面的輸出:

Field  Changed From   Changed To 
125   hello     hello world 
131   hi     h 
141        ABC 

請注意,126不包括在內,因爲沒有變化。

我已經有使用array_diff的代碼,但它似乎並不是一直工作。

$allPossibleFields = array(125, 126, 131, 141); 
$insertionDiff = array_diff($newValues, $oldValues); 
$deletionDiff = array_diff($oldValues, $newValues); 

$returnArray = array(); 
foreach($allPossibleFields as $field) { 
    if (isset($insertionDiff[$field])) { 
     $returnArray[$field]['from'] = $oldValues[$field]; 
     $returnArray[$field]['to'] = $insertionDiff[$field]; 
    } 

    if (isset($deletionDiff[$field])) { 
     if (! isset($returnArray[$field]['from'])) 
     { 
     $returnArray[$field]['from'] = $deletionDiff[$field]; 
     } 

     if (! isset($returnArray[$field]['to'])) 
     { 
     $returnArray[$field]['to'] = $newValues[$field]; 
     } 
    } 
} 

但在某些情況下,它會在有差異並且在某些情況下可以工作時返回空數組。我知道這裏有一個bug,但似乎找不到它。

+0

嘗試使用array_diff_assoc。它會減少需要的代碼量:http://www.php.net/manual/en/function.array-diff-assoc.php – Chad 2013-05-02 14:37:20

+0

什麼是'$ fid'值?它不應該是'$ field'嗎? – ghost 2013-05-02 14:39:42

+0

是的,它應該是剛剛更改的字段 – GGio 2013-05-02 14:40:30

回答

1

你可以使它簡單得多;

foreach($oldValues as $key => $value) { 
    if($value != $newValues[$key]) { 
     echo "Field " . $key . " was changed from " . $value . " to " . $newValues[$key] . "<br />"; 
    } 
} 
+0

它似乎正在爲那些無法正常工作的案例工作。我想bug是用array_diff用法的地方。感謝更好的方法來解決這個問題。更簡單,更少的代碼。我要添加的一件事是在使用它之前檢查是否設置了$ newValues [$ key] – GGio 2013-05-02 14:44:25