通过引用浏览数组正在更改它(未执行任何操作)

鹰1

编辑:不阅读相关主题,下面的答案很清楚并给出了解决方案,而另一个主题仅说明了问题。

我这里有些奇怪

我的代码如下所示:

        var_dump($resultFlatTree);
        foreach($resultFlatTree as &$element)
        {
            /*if(isset($element["action"]) && $element["action"] == "new")
            {
                //let's save the original ID so we can find the children
                $originalID = $element["id"];
                //now we get the object
                $newObject = $setUpForDimension->createAnObject($dimension,$element,$customer);
                $element['id'] = $newObject->getId();
                echo "new";
                //and let's not forget to change the parent_id of its children
                $arrayFunctions->arrayChangingValues($resultFlatTree,"parent_id",$element['id'],$originalID);
                $em->persist($newObject);                                                             
            } */               
        }            
        $em->flush();
        var_dump($resultFlatTree);

foreach内的代码已注释,以确保更改数组不是我在做什么。

这是foreach之前的数组:

array(3) {
  [0]=>
  array(10) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(7) "Revenue"
    ["code"]=>
    string(6) "700000"
    ["sense"]=>
    string(2) "CR"
    ["lft"]=>
    int(1)
    ["lvl"]=>
    int(2)
    ["rgt"]=>
    int(1)
    ["root"]=>
    int(1)
    ["$$hashKey"]=>
    string(3) "00D"
    ["parent_id"]=>
    int(1)
  }
  [1]=>
  array(10) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(7) "Charges"
    ["code"]=>
    string(6) "600000"
    ["sense"]=>
    string(2) "DR"
    ["lft"]=>
    int(3)
    ["lvl"]=>
    int(2)
    ["rgt"]=>
    int(4)
    ["root"]=>
    int(1)
    ["$$hashKey"]=>
    string(3) "00P"
    ["parent_id"]=>
    int(4)
  }
  [2]=>
  array(10) {
    ["id"]=>
    int(4)
    ["name"]=>
    string(6) "Energy"
    ["code"]=>
    string(6) "606000"
    ["sense"]=>
    string(2) "DR"
    ["lft"]=>
    int(2)
    ["lvl"]=>
    int(1)
    ["rgt"]=>
    int(5)
    ["root"]=>
    int(1)
    ["$$hashKey"]=>
    string(3) "00E"
    ["parent_id"]=>
    int(1)
  }
}

然后:

array(3) {
  [0]=>
  array(10) {
    ["id"]=>
    int(2)
    ["name"]=>
    string(7) "Revenue"
    ["code"]=>
    string(6) "700000"
    ["sense"]=>
    string(2) "CR"
    ["lft"]=>
    int(1)
    ["lvl"]=>
    int(2)
    ["rgt"]=>
    int(1)
    ["root"]=>
    int(1)
    ["$$hashKey"]=>
    string(3) "00D"
    ["parent_id"]=>
    int(1)
  }
  [1]=>
  array(10) {
    ["id"]=>
    int(3)
    ["name"]=>
    string(7) "Charges"
    ["code"]=>
    string(6) "600000"
    ["sense"]=>
    string(2) "DR"
    ["lft"]=>
    int(3)
    ["lvl"]=>
    int(2)
    ["rgt"]=>
    int(4)
    ["root"]=>
    int(1)
    ["$$hashKey"]=>
    string(3) "00P"
    ["parent_id"]=>
    int(4)
  }
  [2]=>
  &array(10) {
    ["id"]=>
    int(4)
    ["name"]=>
    string(6) "Energy"
    ["code"]=>
    string(6) "606000"
    ["sense"]=>
    string(2) "DR"
    ["lft"]=>
    int(2)
    ["lvl"]=>
    int(1)
    ["rgt"]=>
    int(5)
    ["root"]=>
    int(1)
    ["$$hashKey"]=>
    string(3) "00E"
    ["parent_id"]=>
    int(1)
  }
}

如您所见,最后一个元素现在已更改且已被引用。这完全弄乱了我以后处理数组的过程。

那是正常的行为吗?我该如何避免呢?

绒毛

当您通过引用foreach语句时,您确实应该阅读docs :)

http://php.net/manual/en/control-structures.foreach.php

为了能够直接修改循环内的数组元素,在$ value之前加上&。在这种情况下,该值将通过引用分配。

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element
?>

$ value的引用和最后一个数组元素即使在foreach循环之后仍然保留。建议通过unset()销毁它。

基本上,这就是说,当您通过ref时,由于有内部指针,它将保持锁定在最后一项上。

第二个用户评论(40分):

“即使在foreach循环之后,仍然保留$ value和最后一个数组元素的引用。建议通过unset()销毁它。”

我对此文件的强调不够!这是一个为什么必须这样做的简单示例:

<?php
$arr1 = array("a" => 1, "b" => 2, "c" => 3);
$arr2 = array("x" => 4, "y" => 5, "z" => 6);

foreach ($arr1 as $key => &$val) {}
foreach ($arr2 as $key => $val) {}

var_dump($arr1);
var_dump($arr2);
?>

输出为:

array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> &int(6) }
array(3) { ["x"]=> int(4) ["y"]=> int(5) ["z"]=> int(6) }

请注意,$ arr1中的最后一个索引现在是来自$ arr2中的最后一个索引的值!

如果您在该链接中查找“参考”,还会发现更多有趣的评论。

tl; dr:有点有趣/笨拙/奇怪/未打补丁。在编写代码并为其腾出空间时,请理解其中的含义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过引用浏览数组正在更改它(未执行任何操作)

来自分类Dev

ChangeDisplaySettings成功,但不执行任何操作。我如何使它工作?

来自分类Dev

原始数组更改,未做任何修改

来自分类Dev

awk:如果未匹配任何模式,则执行“默认”操作?

来自分类Dev

OpenCV,通过引用传递 Mat,并更改它的类型

来自分类Dev

通过Heroku Shell无法执行任何操作

来自分类Dev

通过Facebook的android登录不执行任何操作

来自分类Dev

无法更改root密码,passwd不执行任何操作

来自分类Dev

设置为按下的floatactionbutton的状态未执行任何更改

来自分类Dev

PHP数组传递给javascript函数不执行任何操作

来自分类Dev

集合已更改。未执行可能的库存操作

来自分类Dev

'sbt〜run'表明它正在重新编译,但是看不到任何更改

来自分类Dev

通过C ++中的引用传递未签名的char数组

来自分类Dev

我正在使用acttime应用程序,无法在子窗口中执行任何操作

来自分类Dev

在没有任何人“知道”它的情况下执行异步操作可以吗?

来自分类Dev

点击未执行的操作

来自分类Dev

Javascript中的变量引用。通过函数引用全局变量并对其执行操作

来自分类Dev

Selenium创建空白的Firefox浏览器窗口,然后不执行任何操作,而是运行selenium浏览器测试

来自分类Dev

Spring Reactor doOnNext,它正在执行吗?

来自分类Dev

AWS apigateway是否会更改http正文?如何阻止它执行此操作?

来自分类Dev

OpenMP:并行执行任何操作

来自分类Dev

pushViewController不执行任何操作

来自分类Dev

FileSaver不执行任何操作

来自分类Dev

当单击列表视图项时,未执行任何操作,并且LogCat显示ViewPostImeInputStage ACTION_DOWN

来自分类Dev

如何在未执行任何操作的情况下将单选按钮标记为已选中?

来自分类Dev

当我尝试对R中的数据集进行升采样时,未执行任何操作

来自分类Dev

jQuery检测用户是否单击了输入-如果未执行任何操作

来自分类Dev

尝试执行任何apt操作时出现“ E:pycompile:233:未安装请求的版本”

来自分类Dev

当单击列表视图项时,未执行任何操作,并且LogCat显示ViewPostImeInputStage ACTION_DOWN

Related 相关文章

  1. 1

    通过引用浏览数组正在更改它(未执行任何操作)

  2. 2

    ChangeDisplaySettings成功,但不执行任何操作。我如何使它工作?

  3. 3

    原始数组更改,未做任何修改

  4. 4

    awk:如果未匹配任何模式,则执行“默认”操作?

  5. 5

    OpenCV,通过引用传递 Mat,并更改它的类型

  6. 6

    通过Heroku Shell无法执行任何操作

  7. 7

    通过Facebook的android登录不执行任何操作

  8. 8

    无法更改root密码,passwd不执行任何操作

  9. 9

    设置为按下的floatactionbutton的状态未执行任何更改

  10. 10

    PHP数组传递给javascript函数不执行任何操作

  11. 11

    集合已更改。未执行可能的库存操作

  12. 12

    'sbt〜run'表明它正在重新编译,但是看不到任何更改

  13. 13

    通过C ++中的引用传递未签名的char数组

  14. 14

    我正在使用acttime应用程序,无法在子窗口中执行任何操作

  15. 15

    在没有任何人“知道”它的情况下执行异步操作可以吗?

  16. 16

    点击未执行的操作

  17. 17

    Javascript中的变量引用。通过函数引用全局变量并对其执行操作

  18. 18

    Selenium创建空白的Firefox浏览器窗口,然后不执行任何操作,而是运行selenium浏览器测试

  19. 19

    Spring Reactor doOnNext,它正在执行吗?

  20. 20

    AWS apigateway是否会更改http正文?如何阻止它执行此操作?

  21. 21

    OpenMP:并行执行任何操作

  22. 22

    pushViewController不执行任何操作

  23. 23

    FileSaver不执行任何操作

  24. 24

    当单击列表视图项时,未执行任何操作,并且LogCat显示ViewPostImeInputStage ACTION_DOWN

  25. 25

    如何在未执行任何操作的情况下将单选按钮标记为已选中?

  26. 26

    当我尝试对R中的数据集进行升采样时,未执行任何操作

  27. 27

    jQuery检测用户是否单击了输入-如果未执行任何操作

  28. 28

    尝试执行任何apt操作时出现“ E:pycompile:233:未安装请求的版本”

  29. 29

    当单击列表视图项时,未执行任何操作,并且LogCat显示ViewPostImeInputStage ACTION_DOWN

热门标签

归档