2013-05-02 3 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 содержит новые значения после того, как пользователь сохранил изменения.

Несколько пользователей доступ к странице в то же время, так что если один пользователь вратаря обновить страницу и делает какие-либо изменения и нажимает на кнопку Сохранить, я хочу, чтобы иметь возможность показать, что "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]; 
     } 
    } 
} 

но в некоторых случаях он возвращает пустой массив, когда есть разница, и в некоторых случаях он работает. Я знаю, что где-то здесь есть ошибка, но, похоже, она не находит ее.

+0

Попробуйте использовать array_diff_assoc. Это сократит количество необходимого кода: http://www.php.net/manual/en/function.array-diff-assoc.php – Chad

+0

Что такое значение $ fid? Разве это не '' поле? – ghost

+0

да, это должно быть поле, которое только что изменилось. – GGio

ответ

1

Вы можете сделать это намного проще, чем это;

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

кажется, что он работает сейчас для тех случаев, когда он не работал. Я предполагаю, что ошибка была где-то с использованием array_diff. Спасибо за лучший способ приблизиться к этому. Намного проще и меньше кода. Одна вещь, которую я бы добавил, это проверить, установлен ли $ newValues ​​[$ key] перед ее использованием – GGio