php的foreach中使用取地址符,注意释放

  一说起这,就想到那次去360面试的面试题,当时毕竟图样,答错了哈哈~顺便说下,那时的技术面倒是通过了哈哈~

  先来举个例子,类似的面试题。

 1 <?php
 2
 3 $array = array(1, 2, 3);
 4
 5 foreach ($array as &$value) {}
 6
 7 // unset($value);
 8
 9 foreach ($array as $value) {
10     // print_r($array);
11 }
12
13 echo implode($array);// 122

有的童鞋可能会答123,这里就说下,为什么是122。

在第5行代码里,循环$array时,使用的取地址符。循环结束以后,并没有释放$value,注意foreach并没有自己的域。所以如果不释放掉他,他依然存在在以后的代码。就此可能埋下了意外的bug。

循环结束后,这个$value指向的是数组第三个元素上。此时$array = array(1, 2, 3); 没有问题。  好,接着看第9行代码。

循环的时候如下进行(可以打开第10行注释查看):

把数组第一个元素的值1,给这个$value(指向的第三个元素上),第一次循环结束,数组是array(1, 2, 1);

第二次循环,把第二个元素的值2,再给这个$value(它仍然指向的是第三个元素)。数组变成了array(1, 2, 2);

第三次循环,把第三个元素的值2,再给这个$value,这样就变成了array(1, 2, 2);

所以,写代码时,如果循环时,取了地址,循环结束时尽量要unset()掉。除非你自己知道自己在干什么哈哈。

比如打开第7行的注释,那么结果就是123了。

时间: 2024-12-21 02:45:24

php的foreach中使用取地址符,注意释放的相关文章

PHP foreach 循环使用&quot;&amp;$val&quot; 地址符“&amp;”

在熟悉项目代码的时候 看到这样的foreach 循环: foreach($data as &$val){ .... } 第一次看到循环里面使用了地址符"&",我印象中的这个符号 是直接取到了这个变量的地址. 然后里面的循环操作,相对来说是高大上了点,比如说下面的例子: 我现在有一个需求 给一个数组添加一个元素,经常会有这种需求     商品统计:商品价格.商品销售数量    需求是 想统计出商品总收入 $arr = array( array('price' =>1

C/C++中的取地址与引用

取地址和引用都采用&的标识符,很容易让人造成误会. 就c/C++而言.引用只是C++中的知识,而取地址是两者共有的. 取地址: 在第6行中我定义了一个指向int类型的指针p,运用&a获取a的地址,并将a的地址赋予它,即p指向a所在的空间. 在第7行中取p所指向空间的值(*:有个高端名字叫解引用)输出. 引用: 在第6行我定义了一个引用b,并将a赋予b.其实质就是给a取了一个小名叫b.对a操作就是对b操作,如果改变b的值(eg.b=20),那么a的值也相应改变(a也会等于20) 从第7.8行

C/C++注 意数组后面的取地址符!!

#include<iostream> #define Min(a,b) (a>b?b:a) using namespace std; int main() { int a[5]={1,2,3,4,5}; int *p=(int *)(&a+1);//本身数组名就是地址了,也就是数组名就是指针,>取数组的地址,也就是取指针的地址,即p为指向数组的指针(指针的指针),当&a+1,p指向的其实是数组末尾5后面的地址,当p-1,往回退一格回到数组的末尾,>即5. in

关于C语言取地址运算符”&amp;“

关于C语言地址.取地址运算符"&" 2015-04-14  青岛  张俊浩 今天在论坛贴吧看到关于C语言运算符"&"的问题,因为之前自己学C语言时也遇到这个问题,就整理一下思路回帖,也顺便整理成一篇博客~ 问题如下: int a; scanf("%d",&a); 我们老师讲,&是取地址符,但是我就奇怪,为什么叫取地址? 我们明明是想知道a是多少,而不是说它在哪,地址不是形容一个事物在哪吗?我输个10,a就是10了.

数组名a、数组名取地址&amp;a、数组首地址&amp;a[0]、数组指针*p

本文链接:https://blog.csdn.net/loongkingwhat/article/details/78910921 数组和指针向来就是傻傻分不清,当他们一起出现的时候就更加懵逼. 1 解析不同变量之间的区别: 数组名a: 数组名可以作为数组第一个元素的指针.我们由数组和指针的关系知道,a代表这个地址数值,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址.数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的,即a+i= & a[i

浅谈C/C++数组取地址

本文讲的是关于C/C++数组取地址一些基本的概念,但是新手可能会在学习相关内容时产生一定的困惑,希望本文能帮助到你. 我们先来看以下一段代码: 1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int array[6] = { 1,2,3,4,5,'\0'}; 5 cout<<array<<endl; 6 cout<<&array<<endl; 7 return 0;

C语言中对数组名取地址

在C/C++中,数组名相当于一个指针,指向数组的首地址.这里"相当于"不代表等于,数组名和指针还是有很多区别的,这个在<C陷阱与缺陷>里有详尽的讲述.而这里要说的是对于数组名取地址的这么一个操作. 如果声明有如下数组: int arr[5]; 那么,&arr这个操作得到了什么值呢? 如果简单的认为arr就是一个指向数组首地址的指针的话,那么很自然会想到&arr得到的是一个指向存放arr这个指针的指针,也就是一个二级指针,然而事实却并不是这样. 观察以下代码:

如何使用JAVA语言抓取某个网页中的邮箱地址

现实生活中咱们常常在浏览网页时看到自己需要的信息,但由于信息过于庞大而又不能逐个保存下来. 接下来,咱们就以获取邮箱地址为例,使用java语言抓取网页中的邮箱地址 实现思路如下: 1.使用Java.net.URL对象,绑定网络上某一个网页的地址 2.通过java.net.URL对象的openConnection()方法获得一个URLConnection对象 3.通过URLConnection对象的getInputStream()方法获得该网络文件的输入流对象InputStream 4.循环读取流

Delphi中使用@取函数地址的问题(转)

Delphi中使用@取函数地址的问题 例如以下代码:unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs;type  TForm1 = class(TForm)    procedure one();    function two(x,y:integer):integer;  private    { Private declarat