PHP 数组 foreach引用导致的bug

<?php
$arr = array(‘a‘, ‘b‘, ‘c‘);
foreach($arr as &$v) {}
foreach($arr as $v) {}
var_dump($arr);
/*
结果为:
array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  &string(1) "b"
}
*/

//第一个foreach用引用赋值的方式将数组的值依次赋给了$v。
$arr = array(‘a‘, ‘b‘, ‘c‘);
foreach($arr as &$v) {}
var_dump($v);
//此时的$v的值为c,是引用赋值,$v指向了字符串c的地址空间。

//第二个foreach是以拷贝赋值的方式将数组的值依次赋值给了$v。
//由于目前$v指向了c的地址空间,那么改变$v的值即改变了c所占地址空间的值。
$arr = array(‘a‘, ‘b‘, ‘c‘);
foreach($arr as &$v) {}
foreach($arr as $v) {
    var_dump($arr); break;
}
//第一次赋值将a赋值到了$v,原有c所占的地址空间的值变为了a,此时数组就是array(‘a‘, ‘b‘, ‘a‘)。
//以此类推第一次赋值c->a,第二次赋值即a->b,第三次赋值即b->b,
//所以最终结果为array(‘a‘, ‘b‘, ‘b‘)。

这个问题是这样的  foreach本身是一个赋值的过程, 第一次foreach结束的时候 $value和$arr[2] 两个变量都指向了$arr[2],  第二次foreach的时候 每次foreach本质上是一次赋值行为, 也就是 $value = $arr[0;  这样就把$arr[2] 赋成$arr[0]了  同理 第二次的时候$arr[2] = $arr[1]  导致 $arr[2]每次循环的时候都会被重新赋值

时间: 2024-12-28 20:36:23

PHP 数组 foreach引用导致的bug的相关文章

PHP数组foreach引用问题

<?php $arr = array('1','2'); foreach($arr as &$value){ } foreach($arr as $value){ var_dump($value); } 输出 string(1) "1" string(1) "1" 这样解释吧,把foreach展开成赋值的话 foreach($arr as &$value) { //noop } 大致是 #begin first foreach $value =

php foreach引用赋值

在写代码时发现php foreach引用赋值会导致意外的行为. 代码示例: <?php $arr = array('a','b','c'); foreach($arr as $k=>&$v) { } print_r($arr); foreach($arr as $k=>$v) { } print_r($arr); ?> 输出结果: Array ( [0] => a [1] => b [2] => c ) Array ( [0] => a [1] =&

PHP foreach引用

PHP  foreach引用 首先,上代码 $arr=[1,2,3,4,5,6]; foreach ($arr as $key => &$value) { if($value==4){ unset($arr[$key]); } } foreach ($arr as $key => $value) { echo $value; } 各位认为echo的结果会是什么?你可能会很快算出结果为 '1,2,3,5,6',但是,结果会有点小意外,各位不妨输出一下 结果会是'1,2,3,5,5'.那么

说说PHP中foreach引用的一个坑

From: http://blog.csdn.net/yipiankongbai/article/details/45307767 先来看看下面这段代码: <?php $arr = array('apple','banana','cat','dog'); foreach($arr as $key=>$val) { //some code } echo $val; //输出dog echo $key; //输出3 //下面对val进行赋值 $val = 'e'; print_r($arr); /

对非正确使用浮点型数据而导致项目BUG的问题探讨

乘法分配律 在上小学的时候就已经学习过乘法分配律,乘法分配律的具体内容是:两个数的和与一个数相乘,可以先把他们分别与这个数相乘,再相加,得数不变.乘法分配律的定义还可以用表达式"(a+b)×c = a×c+b×c"的形式给出.乘法分配律的反用"a×c+b×c = (a+b)×c"同样成立.例如"10.2×(3+7) = 10.2×3+10.2×7 = 102"(反用形式为"10.2×3+10.2×7 = 10.2×(3+7) = 102

编程题:结构体数组的引用。功能:输出结构体数组各元素的成员值

编程题:结构体数组的引用.功能:输出结构体数组各元素的成员值 #include<stdio.h> void main() { struct person { char name[20]; char sex; int age; float height; }per[3]={{"Li Ping",'M',20,175},{"Wang Ling",'F',19,162.5}, {"Zhao Hui",'M',20,178}}; int i;

《C++ Primer》学习 之 返回数组的引用(返回数组的指针,方法与之相同)

/* 返回数组的引用(返回数组的指针,方法与之相同) 共四种方法(在下面示例程序中,调用其中一种方法时,需要将其他三种方法注释掉)*/ 1 #define _CRT_SECURE_NO_WARNINGS 2 #define HOME 3 #include <iostream> 4 #include <stdexcept> 5 #include <ctype.h> 6 #include <locale> 7 #include <iterator>

从一个弱引用导致的奔溃 谈 weak assign strong的应用场景【iOS开发教程】

从一个弱引用导致的奔溃 谈 weak assign strong的应用场景 .h中的定义方法一: @property (nonatomic, assign) NSArray *dataSource; 定义方法二 @property (nonatomic, strong) NSArray *dataSource; .m中的实现方法 - (void)viewDidLoad { [super viewDidLoad]; if (YES) { NSArray *array = @[@"1",

c/c++ 函数指针 指针函数 数组的引用 指针数组 数组指针

1.指针数组数组指针 引用数组 数组的引用 int *a[10] 指针数组 每一个元素都是一个指针 Int (*a)[10] 数组指针 P指向一个含有10个元素的数组 Int (&a)[10] 数组的引用 a是一个数组的引用 Int& a[10] 引用函数 非法 数组的引用:1.在程序体中 int a[10]; Int (&p)[10]=a;//引用数组 2.作为参数 #include <iostream> #include <string> using n