big o — PHP более эффективный алгоритм, чем array_diff_assoc ()

У меня есть контактный массив с набором значений, которые мне нужно обновить. У меня также есть массив 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'
);

0

Решение

Ты можешь попробовать 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);
1

Другие решения

Следующий подход, который я бы попробовал:

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];
}
}
0

По вопросам рекламы [email protected]