array_merge все кроме одной пары ключ / значение? PHP
Я хотел бы объединить два пользовательских объекта (один дубликат). Проблема в том, что один пользовательский объект имеет некоторые поля, а другой нет, и наоборот. Я бы хотел array_merge
все пары ключ / значение, кроме id
, Есть какой-либо способ сделать это?
Вот мой код ниже. Когда я пытаюсь слить, $second_user
не удаляет, как я хотел бы. Если я закомментирую блок слияния, он удаляет дубликаты без слияния. Однако, когда я комментирую это снова, все еще есть дубликаты.
Я думаю, что проблема пытается использовать array_merge
когда id
это неизменное поле.
public function combine($first_user, $second_user)
{
// Always make sure $first_user is the "original" user that we're going merge.
if ($first_user->created_at > $second_user->created_at) {
$tmp = $second_user;
$second_user = $first_user;
$first_user = $tmp;
}
// Merge their data and save to the first user
$updated_user = array_merge(array_filter($second_user->toArray()), array_filter($first_user->toArray()));
$first_user->fill($updated_user)->save();
$second_user->delete();
}
2 ответа
Просто сбросьте идентификатор после слияния:
$array = array_merge($arr1, $arr2);
unset($array['id']);
Я не уверен на 100%, правильно ли я понял, но если вы не хотите добиться следующего:
- используйте $first_user var в качестве "основного" var для хранения данных
- и сохраните данные $first_user var (включая ID)
- и добавьте поля $second_user в $first_user, сохраняя существующие данные $first_user
Если это так, вместо array_merge просто используйте оператор array +:
$arr1 = array_filter($first_user->toArray());
$arr2 = array_filter($second_user->toArray());
$updated_user = $arr1 + $arr2; // union
Оператор + возвращает правый массив, добавленный к левому массиву; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а соответствующие элементы из правого массива будут игнорироваться.