在哪里可以做网站赚钱,网站空间分类,揭阳网站建设方案外包,怎么做县城分类信息网站这篇文章也可以在我的博客查看
搞WordPress#xff0c;难免跟php打交道 然而这弱类型语言实在坑有点多 这不今儿又踩了个大坑直接时间-1#x1f605;
问题
话不多说直接上代码
?php
$items [1,2];foreach ($items as $item) {/*empty loop*/}
print_r($items)…这篇文章也可以在我的博客查看
搞WordPress难免跟php打交道 然而这弱类型语言实在坑有点多 这不今儿又踩了个大坑直接时间-1
问题
话不多说直接上代码
?php
$items [1,2];foreach ($items as $item) {/*empty loop*/}
print_r($items);foreach ($items as $item) {/*empty loop*/}
print_r($items);请问最后的输出是什么 答案是
Array
([0] 1[1] 2
)
Array
([0] 1[1] 1
)不是我啥也没干呢发生什么事了 我懂了一定是我的/*empty loop*/注释把数据改了不是
原因
原因其实有二但凡php没那么“强大”都不会造成这个问题
php支持“引用”而非指针php的变量作用域由定义开始生效直到函数/文件结束不存在代码块为基础的局部作用域花括号
同时满足这俩条件的语言好像还真蛮少的 因此我这不就暴毙了嘛
首先第一个循环使用引用对$item赋值
因此循环结束后$item事实上是最后一个元素的引用
然后循环结束后$item并没有因为循环结束而终止生命周期
因此第二次循环的$item事实上还是指向最后一个元素的引用
最后第二次循环没有使用引用赋值
因此改变的不是引用指向而是引用当前指向的值
因此最后一个元素在第二次循环中被赋值了n次
小测试
如果$items[1,2,3]最后的结果是什么 答案是Array([0] 1 [1] 2 [2] 2)
这个错误造成的不是第二次输出全部重复而只是第n个元素被修改成n-1的值 跟着循环走一遍就很好理解
第一步$item $items[0] 1此时$items[2] $item 1第二步$item $items[1] 2此时$items[2] $item 2第三步$item $items[2] 2因为上一步 谢谢你我的PHP 参考资料
PHP Foreach Pass by Reference: Last Element Duplicating? (Bug?)