繁体   English   中英

Foreach循环遍历多维关联数组,最后一个子数组的值以某种方式被前一个子数组覆盖

[英]Foreach looping through multidimensional associative array, value of last subarray is somehow overwritten by previous subarray

我将 CSV 解析为关联数组。 数组输出为

大批 (
[索引 0-24...]

[Susie Wagner] => Array([巧克力花生酱 - 3] => 1 [Smores 蛋白质咬 - 10] => 1 [香草南瓜 - 6] => 0.5)

[先生。 Hirthler] => Array ( [糙米牛肉碎 - 招牌] => 3 [红薯泥土火鸡 - 招牌] => 2 [素食西葫芦面条千层面 - 招牌] => 2))

如 CSV 解析中内置数组的 print_r 所示。

然后我遍历数组

print_r($meals);
foreach($meals as $k=>$v){

    echo "checking $k<br>";
        print_r($v);
}

出于某种原因,仅影响 $meals 的最后一个元素,单个 print_r 输出的数组为:

检查 Hirthler 先生
阵列 ( [巧克力花生酱果仁 - 3] => 1
[Smores 蛋白质叮咬 - 10] => 1
[香草南瓜子 - 6] => 0.5)

而不是

Array ( [碎牛肉配糙米 - 签名] => 3
[用红薯泥磨碎火鸡 - 签名] => 2
[素食西葫芦面条千层面-签名] => 2 )

你会期待 Hirthler 先生...

我不知道如何解释/克服这一点。 这是一个现有的代码库,我最近对其进行了一些更改,但以前没有问题。 我最近的变化似乎都不是罪魁祸首,尽管我认为它们一定是。 数据的结构没有任何变化,只是我在此之后所做的处理。

对不起,如果我的格式不是很好,长期 S/O 读者,第一次海报。 如有必要,很乐意提供完整的代码示例,但在帖子正文中这样做似乎有些过分。

编辑:这是完整的代码:

PHP (如您所见,我必须在循环中对 Hirthler 先生的值进行硬编码才能获得所需的结果)

CSV

这个确切的行为记录在foreach参考中的警告中:

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

所以在上一个循环结束时, $v仍然是对迭代中最后一个元素的引用(它指向相同的内存区域),并且在使用foreach ($meals as $k => $v)创建新循环时foreach ($meals as $k => $v) ,数组中的每一项都按值复制到现有引用(数组的最后一个元素)中,覆盖先前的值。

当您迭代数组上的第一个元素时,一切看起来都很好,但是当它到达迭代中的最后一个元素时,引用的当前值是迭代的最后一个元素(数组中的倒数第二个),因此它被复制并且错误表现出来。 这就是为什么在foreach之前你会得到预期的结果,直到你到达最后一个元素。

实际上,只要您开始循环,就会出现错误:如果您要在当前值旁边输出数组中的最后一个元素,您会发现它们是相同的。 但这不是您通常会做的事情。

foreach ($meals as $k => $v) {      
     print_r($v);
     print_r(array_values($meals)[count($meals) - 1]);
}

长话短说:在使用引用时必须注意这一点,并在完成后调用unset()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM