[英]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 先生的值进行硬编码才能获得所需的结果)
这个确切的行为记录在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.