У меня есть два массива, которые состоят из массивов. Мне нужно слить эти массивы рекурсивно. Но мне нужно сделать это действие несколько раз, и
array_merge_recursive()
добавлю мои данные дважды, я хочу удалить элемент, который уже существует в целевом массиве.
массив $ messages:
array(2) {
["messages"]=>
array(2) {
["test.testik"]=>
string(13) "Це тест"["test2313.tes31231tik"]=>
string(23) "це тестончик"}
["validators"]=>
array(4) {
["valid.validik"]=>
string(36) "Це валідне значення"["joga.jimbo"]=>
string(27) "Джімбо торбінс"["validka.invalidka"]=>
string(23) "це інвалідка"["smith.john"]=>
string(17) "джон сміт"}
}
массив $ allCar:
array(2) {
["messages"]=>
array(1) {
["test2313.tes31231tik"]=>
string(23) "це тестончик"}
["validators"]=>
array(2) {
["validka.invalidka"]=>
string(23) "це інвалідка"["smith.john"]=>
string(17) "джон сміт"}
}
Я написал некоторый код:
foreach ($messages as $domain => $messagesArray) {
foreach ($allCat as $d => $mess) {
if ($domain == $d) {
foreach ($messagesArray as $ymlkey => $trans) {
foreach ($mess as $ymlk => $transl) {
if ($ymlkey == $ymlk) {
unset($mess[$ymlk]);
}
}
}
}
}
}
Затем, когда я запускаю рекурсивное слияние, он добавляет те же значения в массив. Что я делаю не так?
Это:
foreach ($allCat as $d => $mess) {
$ mess является временным COPY любого значения, над которым сейчас работает цикл foreach (). Когда вы делаете свой unset($mess...)
позже вы просто удаляете эту временную копию.
Хотя некоторые могут предложить $mess
ссылка, это может / вызовет проблемы позже, потому что $ mess будет ВСЕ ЕЩЕ оставаться ссылкой после окончания цикла, и повторное использование переменной будет теперь возиться с тем, на что $ mess последний раз указывал в цикле.
Вместо этого используйте полный путь к массиву / объекту в вызове unset:
unset($messages[$domain][$d][$ymlkey][$ymkl])
или как там должно быть. Таким образом вы гарантируете, что вы работаете с реальным «реальным» массивом, а не с любой из множества временных копий, которые создают ваши вложенные циклы.
Других решений пока нет …