高级取消设置值形式数组 PHP

advanced unset the value form array PHP

我有两个数组,什么是数组。我需要递归合并这些数组。但是这个动作我需要做几次,

array_merge_recursive()

将追加我的数据两次,我想删除目标数组中已经存在的元素。 $消息数组:

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 作为一个引用,但这个 can/will 会在以后引起问题,因为 $mess 在循环结束后仍将是一个引用,并且稍后会重新使用该变量处理循环中最后指向的任何 $mess。

相反,在未设置调用中使用完整的 array/object 路径引用:

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

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