php中foreach
1. PHP foreach 遍历修改值的正确方法与踩坑!
基础使用:foreach在PHP中提供了一种简洁的遍历数组的方式。它仅适用于数组和对象。尝试应用于其他数据类型的变量或未初始化的变量将导致错误信息。
使用foreach时,有两种格式进行遍历。第一种格式直接遍历给定的array_expression数组。每次循环中,当前单元的值被赋给$value,同时数组内部的指针向前移一步,以获取下一个单元。第二种格式与第一种类似,但同时还会将当前单元的键名赋给变量$key。
PHP的数组实质上是一个键值对形式的映射。在不指定key的情况下,如上代码中的$a变量就是只定义了$value而没有定义$key的数组,数组的下标分别为0、1、2,对应的值分别为2、4、8。
$b变量定义了$key和$value,说明在PHP中数组下标可以是自定义的。如果未定义下标,则默认从0开始计数数组下标。
这就是使用foreach对PHP数组进行遍历的方法。若要在遍历的同时修改数组中的值,应这样做:
注意,在$value变量前添加了&符号,以将遍历到的值的引用赋给$value。如果不添加&,赋值操作将无效。
使用此方法后,数组中的值将变为20、40、80。
使用&后,继续遍历$a查看值,结果为:
如果不使用unset()销毁该引用,则输出结果为:
为什么会出现这种情况?我们将分步解析整个过程:
循环1-1:由于$v是一个引用,因此$v = &$a[0],$v = $v * 10相当于$a[0] * 10。此时,$a = [20, 4, 8]。
循环1-2:$v = &$a[1],$v = $v * 10相当于$a[1] * 10。此时,$a = [20, 40, 8]。
循环1-3:$v = &$a[2],$v = $v * 10相当于$a[2] * 10。此时,$a = [20, 40, 80]。
循环2-1:隐含操作$v = $a[0]被触发,由于$v仍是$a[2]的引用,相当于$a[2] = $a[0]。此时,$a = [20, 40, 20]。
循环2-2:$v = $a[1],此时$v仍是$a[2]的引用,即$a[2] = $a[1]。此时,$a = [20, 40, 40]。
循环2-3:$v = $a[2],此时$v仍是$a[2]的引用,即$a[2] = $a[2]。此时,$a = [20, 40, 40]。
为解决此问题,PHP官方文档建议使用unset()销毁最后一个元素的引用。
遇到问题时,优先查找官方文档,这很可能直接解决问题。当然,如果这篇白话解读解决了你的问题,请点个赞吧!