0

我有两个数组,由数组组成。我需要递归合并这些数组。但我需要多次执行此操作,并且

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

然后,当我运行递归合并时,它会将相同的值附加到数组中。我做错了什么?

4

1 回答 1

2

这个:

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

$mess 是您的 foreach() 循环当前正在处理的任何值的临时副本。当您unset($mess...)稍后执行时,您只是取消设置该临时副本。

虽然有些人可能会建议进行$mess引用,但这可能/将在以后引起问题,因为在循环结束后 $mess 仍将是一个引用,并且稍后重用该变量现在将与 $mess 最后在环形。

相反,在 unset 调用中使用完整的数组/对象路径引用:

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

或者应该是什么。这样您就可以保证您使用的是实际的“真实”数组,而不是嵌套循环正在创建的许多临时副本中的任何一个。

于 2015-01-22T15:36:27.887 回答