0

У меня есть два массива, из которых состоят массивы. Мне нужно объединить эти массивы рекурсивно. Но мне нужно сделать это действие несколько раз, иadvanced unset массив формы значений PHP

array_merge_recursive()

будет apend моих данных дважды, я хочу, чтобы удалить элемент, что уже существует в целевом массиве. $ Сообщения массив:

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

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

+2

Вам нужно будет предоставить начальные массивы и ожидаемый результат. – AbraCadaver

+0

@AbraCadaver, я добавил массив, который должен быть compaerd. – nowiko

ответ

2

Это:

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

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

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

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

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

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

+0

Серьезный вопрос: если вы 'unset ($ mess);' не будет ли это не позволять его использовать (даже как ссылку) после завершения цикла? Разве это не все, что нужно для 'unset()'? – Kirkland

+0

Да, вы могли бы отключить $ mess прямо после циклов, но код op не делает этого - просто рассортируйте что-то INSIDE $ mess. –

+0

Ах, ладно. Полностью упущен, что он не был 'unset ($ mess);' but 'unset ($ mess ['var'])' вместо этого. К сожалению. – Kirkland