PHP array_merge не работает

Работаем с PHP. У меня есть массив 1 с этими ключами и значениями:

$array_1 = array(
(more values)
'propub_cost_max' => 5,
'propub_cost_min' => 0.5,
'average_calc_last' => '-1 Months',
'propub_qtd_first_offer' => 4
);

и массив 2:

$array_2 = array(
'propub_cost_max' => 20,
'propub_cost_min' => (no value),
'average_calc_last' => (no value),
'propub_qtd_first_offer' => (no value)
);

Я хочу объединить массив 2 с массивом 1, поэтому я сделал:

$result = array_merge($array_2, $array_1);

Но результат такой:

$result = array(
(more values)
'propub_cost_max' => 5,
'propub_cost_min' => 0.5,
'average_calc_last' => '-1 Months',
'propub_qtd_first_offer' => 4
);

Ключ propub_cost_max должен принимать значение 20, верно?

Идея состоит в том, чтобы сохранить некоторые значения и, конечно, заменить их там, где значения другие, если они есть. Я думал, что array_merge должно работать, но ...

Спасибо вам всем.


person nGetIt Com    schedule 06.11.2016    source источник
comment
Вместо скобок стоит }.   -  person TheValyreanGroup    schedule 06.11.2016
comment
Если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этого ключа перезапишет предыдущее. php.net/manual/en/function.array-merge.php. в вашем случае array_1 - последний   -  person    schedule 06.11.2016
comment
Спасибо @TheValyreanGroup   -  person nGetIt Com    schedule 06.11.2016


Ответы (2)


«Если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этого ключа перезапишет предыдущее.». в вашем случае array_1 - это последнее.

Говорит nogad.

(ссылка на array_merge)

А также

У вас есть} вместо круглых скобок.

Как говорится в TheValyreanGroup.

Оба они абсолютно верны. Так

$result = array_merge($array_1, $array_2); 

Решу вашу проблему. Значения меняются местами, так что $array_2 теперь перезаписывает значения в $array_1.

Чтобы решить вашу общую проблему, связанную с желанием обновить некоторые значения, не зная, какие значения и какие условия вы хотите сохранить, мы вынуждены просто не перезаписывать значения пустыми, поэтому:

$array_2 = array_filter($array_2); //clears empty values
$result = array_merge($array_1, $array_2); // as before. updates non-empty new values.
person Community    schedule 06.11.2016
comment
} - это, очевидно, ошибка копирования, иначе скрипт даже не запустился бы, и он вообще не получил бы никакого результата. - person Barmar; 06.11.2016
comment
Что ж, это решит проблему в этом тестовом примере, но желаемое поведение в общем случае, по-видимому, заключается в том, что max получает большее из двух значений, а не второе из двух (хотя их замена здесь помогает). - person Jeremy Kahan; 06.11.2016
comment
@Barmar ну да, но я думаю, что все же стоит указать, что закомментировать, поскольку опечатки часто имеют решающее значение для возникновения ошибок, и у пользователя с привычкой к опечаткам (и не обнаруживать и не исправлять их) будет много проблем с кодом, которые они не могут решить самих себя. - person Martin; 06.11.2016
comment
видя, как я генерирую ответ из комментария других людей, я его сообщил, так что не стесняйтесь редактировать, как вам нужно, @JeremyKahan - person Martin; 06.11.2016
comment
@Martin, который очень забавен с вашей стороны, но я недостаточно хорошо знаю PHP, чтобы закодировать его поэлементно, поэтому, если ключ содержит min, один выбирает меньшее из двух значений (при условии, что оба существуют), если он содержит max, выберите крупнее, а иначе плоскодонка. - person Jeremy Kahan; 06.11.2016
comment
Я добавил array_filter, чтобы пустые значения не перезаписывали непустые значения, кроме этого нам потребуются дополнительные сведения от OP, чтобы сделать больше. - person Martin; 06.11.2016
comment
@ Мартин, большое спасибо. Извините за}. Отличный ответ, отлично работает. - person nGetIt Com; 07.11.2016

Это решит вашу проблему

array_merge_recursive($array_1, $array_2);
person Mohamed hesham    schedule 01.09.2018
comment
Молодец. Так почему это работает? В чем разница ? - person Smokie; 10.01.2020
comment
array_merge заменяет новое старое значение новым значением, если есть совпадение между именами ключей. но array_merge_recursive помещает их в один большой массив вместе. - person Mohamed hesham; 11.01.2020
comment
См. Здесь для получения дополнительной информации. php.net/manual/en/function .array-merge-recursive.php - person Mohamed hesham; 11.01.2020