расширенный сброс значения формы массива переполнения стека

У меня есть два массива, которые состоят из массивов. Мне нужно слить эти массивы рекурсивно. Но мне нужно сделать это действие несколько раз, и

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

Затем, когда я запускаю рекурсивное слияние, он добавляет те же значения в массив. Что я делаю не так?

0

Решение

Это:

        foreach ($allCat as $d => $mess) {

$ mess является временным COPY любого значения, над которым сейчас работает цикл foreach (). Когда вы делаете свой unset($mess...) позже вы просто удаляете эту временную копию.

Хотя некоторые могут предложить $mess ссылка, это может / вызовет проблемы позже, потому что $ mess будет ВСЕ ЕЩЕ оставаться ссылкой после окончания цикла, и повторное использование переменной будет теперь возиться с тем, на что $ mess последний раз указывал в цикле.

Вместо этого используйте полный путь к массиву / объекту в вызове unset:

unset($messages[$domain][$d][$ymlkey][$ymkl])

или как там должно быть. Таким образом вы гарантируете, что вы работаете с реальным «реальным» массивом, а не с любой из множества временных копий, которые создают ваши вложенные циклы.

2

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

Других решений пока нет …