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

Оператор + возвращает правый массив, добавленный к левому массиву; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а соответствующие элементы из правого массива будут игнорироваться.

Другие вопросы по тегам