标签:连接 拷贝 导致 简单 就是 string 传递 无法 问题
今天在用TP做项目的时候遇到一个问题,foreach的时候需要动态往数组里添加数据,示例代码如下:
$arr = array( array(‘id‘=>‘字符串1‘,‘name‘=>‘字符串2‘,‘age‘=>‘字符串3‘), array(‘id‘=>‘字符串4‘,‘name‘=>‘字符串5‘,‘age‘=>‘字符串6‘), ); foreach ($arr as $v) { $v[‘sex‘] = ‘男‘; } var_dump($arr);
结果如下:
array(2) { [0]=> array(3) { ["id"]=> string(10) "字符串1" ["name"]=> string(10) "字符串2" ["age"]=> string(10) "字符串3" } [1]=> array(3) { ["id"]=> string(10) "字符串4" ["name"]=> string(10) "字符串5" ["age"]=> string(10) "字符串6" } }
我们能到看,sex并没有添加成功,也没有见到想象中的数据,比如:
array(2) { [0]=> array(4) { ["id"]=> string(10) "字符串1" ["name"]=> string(10) "字符串2" ["age"]=> string(10) "字符串3" ["sex"]=> string(3) "男" } [1]=> &array(4) { ["id"]=> string(10) "字符串4" ["name"]=> string(10) "字符串5" ["age"]=> string(10) "字符串6" ["sex"]=> string(3) "男" } }
这是为什么?foreach循环的其实是数组的拷贝,而不是该数组本身,如果是数组拷贝的话,肯定是改变数组之前进行的拷贝,根据运行结果得知
虽然循环中确实改变了原有的数组,但循环的是拷贝的数组(也就是老的数组),所以你无法循环到新添加的元素。
说简单一点就是你foreach里的数组是值传递,并非引用传递,如果不清楚值传递和引用传递的话请自行百度了解一下。
这就导致了你在foreach里打印的时候是添加成功了的,而在循环外使用的时候并没有数据,示例代码如下:
foreach ($arr as $v) { $v[‘sex‘] = ‘男‘; var_dump($v); }
//结果如下 array(4) { ["id"]=> string(10) "字符串1" ["name"]=> string(10) "字符串2" ["age"]=> string(10) "字符串3" ["sex"]=> string(3) "男" } array(4) { ["id"]=> string(10) "字符串4" ["name"]=> string(10) "字符串5" ["age"]=> string(10) "字符串6" ["sex"]=> string(3) "男" }
所以也很好解决,在变量前面加上&申明使用引用传递,而非值传递,这里还需要注意一点只有命名变量才可以传地址赋值。
foreach ($arr as &$v) { $v[‘sex‘] = ‘男‘; } var_dump($arr); //结果如下 array(2) { [0]=> array(4) { ["id"]=> string(10) "字符串1" ["name"]=> string(10) "字符串2" ["age"]=> string(10) "字符串3" ["sex"]=> string(3) "男" } [1]=> &array(4) { ["id"]=> string(10) "字符串4" ["name"]=> string(10) "字符串5" ["age"]=> string(10) "字符串6" ["sex"]=> string(3) "男" } }
这是我在日常工作中遇到的问题,这里记录下来
如果本文中有什么错误,希望大家留言指出,一起相互学习,共同进步。
码字不易,转载请附上本文连接。
标签:连接 拷贝 导致 简单 就是 string 传递 无法 问题
原文地址:http://www.cnblogs.com/blibli/p/7944678.html