【问题标题】:advanced unset the value form array PHP高级取消设置值形式数组 PHP
【发布时间】:2015-03-21 11:04:12
【问题描述】:

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

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

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

【问题讨论】:

  • 您需要提供起始数组和预期结果。
  • @AbraCadaver,我添加了需要比较的数组。

标签: php arrays array-merge recursive-datastructures array-unset


【解决方案1】:

这个:

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

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

虽然有些人可能会建议将 $mess 设为引用,但这可能/将在以后引起问题,因为在循环结束后 $mess 仍将是一个引用,并且稍后重用该变量现在将与任何 $循环中最后指向的混乱。

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

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

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

【讨论】:

  • 严重问题:如果您unset($mess); 不会在循环完成后不允许使用它(即使作为参考)?这不是unset() 的重点吗?
  • 是的,您可以在循环之后直接取消设置 $mess,但 op 的代码并没有这样做 - 只是取消设置 $mess 内部的内容。
  • 啊,好吧。完全错过了不是unset($mess);,而是unset($mess['var'])。哎呀。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 2012-01-10
  • 2012-06-17
  • 2019-07-17
  • 1970-01-01
  • 2014-08-20
相关资源
最近更新 更多