У меня есть контактный массив с набором значений, которые мне нужно обновить. У меня также есть массив contactChangeLog, который сохранит разницу между существующим и обновленным контактом. Только ключи, которые обновляются, должны быть сохранены в журнал. Итак, с 2 контактными массивами:
$oldContact = array(
'name' => 'Joeahkd',
'address' => '123 Masjdhfin',
'city' => 'Spring',
'state' => 'CA',
'zip' => '90101',
);
$newContact = array(
'name' => 'Joe',
'address' => '123 Main St',
'city' => 'Springville',
'state' => 'CA',
'zip' => '90101',
);
Я могу использовать array_diff_assoc () …
$existing = array_diff_assoc($oldContact, $newContact);
$update = array_diff_assoc($newContact, $oldContact);
$diff = array('previous' => $existing, 'new' => $update);
print_r($diff);
Тем не менее, я дважды перебираю каждый массив, и кое-что, что я узнал о записи больших О, говорит мне, что это неправильно. Существует ли более алгоритмически эффективный способ возврата обновленных ключей, а также существующих и обновленных значений? Результат должен быть:
$previous = array(
'name' => 'Joeahkd',
'address' => '123 Masjdhfin',
'city' => 'Spring'
);
$updated = array(
'name' => 'Joe',
'address' => '123 Main St',
'city' => 'Springville'
);
Ты можешь попробовать array_filter
:
$updated = array();
$previous = array_filter($oldContact, function($v, $k) {
if ($v != $newContact[$k]) {
$updated[$k] = $newContact[$k];
return true;
}
return false;
}, ARRAY_FILTER_USE_BOTH);
array_filter
будет возвращать ключи / значения из входного массива, если указанная нами функция обратного вызова возвращает true во время каждой итерации ключ / значение, и они будут нашими $previous
, Пока мы делаем проверку в функции обратного вызова, мы создаем $updated
,
ОБНОВИТЬ:
С помощью array_filter
с array_intersect_key
даже вырезать код дальше:
$previous = array_filter($oldContact, function($v, $k) {
return ($v != $newContact[$k]);
}, ARRAY_FILTER_USE_BOTH);
$updated = array_intersect_key($newContact, $previous);
Следующий подход, который я бы попробовал:
public function diff($newObj, $oldObj)
{
$updatedVals = [];
$previousVals = [];
foreach ($newObj as $key => $value)
{
if ($newObj[$key] !== $oldObj[$key])
{
$updatedVals[] = $newObj[$key];
$previousVals[] = $oldObj[$key];
}
return [$newVals, $previousVals];
}
}