foreach的指针问题
从代码:
$arr = array(,,,,);
echo '$arr = array(1,2,3,4,5)','<br>';
foreach($arr as $key => &$row) {
echo key($arr), '=>', current($arr), "||";
echo $key, '=>', $row, "<br>";
} foreach($arr as $key => $row) {
echo key($arr), '=>', current($arr), "||";
//next($arr);
echo $key, '=>', $row, "<br>";
}
exit;
运行的结果:
$arr = array(1,2,3,4,5)
1=>2||0=>1
2=>3||1=>2
3=>4||2=>3
4=>5||3=>4
=>||4=>5
1=>2||0=>1
1=>2||1=>2
1=>2||2=>3
1=>2||3=>4
1=>2||4=>4
(如果删除第二个foreach前的注释号,结果与第一个带引用的foreach相同)
来说,可以发现三个问题
1.foreach语句执行之后,被操作的数组的指针就被往后移动了一位,并取出了数据赋值给$key,$row
2.在两种方式里面使用next,end等函数对foreach的执行不造成影响,因为即使在数组循环的过程中使用函数end将操作数组的指针指向最后一个元素也会继续执行完foreach语句,所以可以推测foreach执行过程中会有一个全局的变量来存储当前操作数组的指针,而是用了next,end等函数之后会生成一个副本。
3.foreach使用引用与非引用可能就在于副本什么时候生成,对于非引用的直接在foreach之后就会生成,对于引用的在调用next,end等函数之前才会生成,也就是在语义分析的时候就已经判断了。
foreach的指针问题的更多相关文章
- foreach() 中用指针指向数组元素,循环结束后最好销毁指针
之前发过一次微博,今天又遇到这个问题,并且再次犯错,于是决定再加深一下. 就举php.net里的一个例子吧 $a = array('abe','ben','cam'); foreach ($a as ...
- PHP遍历数组常用方式(for,foreach,while,指针等等)
1使用for循环遍历数组 count($arr)用于统计数组元素个数 for循环只能用于遍历,纯索引数组!!如果存在关联数组,count统计两种数组的总个数 使用for ...
- PHP数组foreach后使用current取值的问题
先看如下的代码 $arr=['a','b','c']; foreach ($arr as $v){ echo $v.'<br>'; } var_dump(current($arr)); 今 ...
- PHP正则表达式;数组:for()遍历、 foreach ()遍历、each()list()组合遍历;指针遍历
正则表达式: 1.定界符号 任何字符,一般用 // 2. 模式修正符i 写在定界符外面后面,可不区分大小写 3.preg_replace($reg,&q ...
- foreach next 操作数组指针移动问题
2018年10月20日10:39:40 先说结论,foreach 维护的是一套属于自己的数组指针 会在操作数据的时候,分裂一套变量地址,即使你强制使用 & 取地址一样会分裂,不会引用同一套指针 ...
- 用数组指针遍历数组,FOR/FOREACH遍历数组
1. 用数组指针遍历一维数组 <?php header("Content-type:text/html;charset=utf-8"); /*用数组指针遍历一位数组的值*/ ...
- foreach
一 foreach的语法介绍 PHP 4以上的版本包括了 foreach 结构,这只是一种遍历数组简便方法.foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生 ...
- 浅析PHP中for与foreach两个循环结构遍历数组的区别
遍历一个数组是编程中最常见不过的了,这里跟大家讨论下for和foreach两种方法.用这两种方法执行遍历的场景太多太多了,这里我们只针对以下两个数组作为例子来讨论.所谓管中窥豹,多少能理清一点两者的区 ...
- 你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题
一.使用sizeof计算数组长度 1.1 sizeof的基本使用 如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: ,,,,,}; int ...
随机推荐
- CString,string,char*之间的转换(转)
这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差.string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的:char*是从学习C语 ...
- POJ 1144 Network(Tarjan)
题目链接 题意 : 找出割点个数. 思路 : Tarjan缩点,u是割点的充要条件是:u要么是具有两个以上子女的深度优先生成树的根,要么不是根,而有一个子女v满足low[v]>=dfn[u]. ...
- ExtJs之Ext.query
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- CF 353A Domino
#include<stdio.h> #include<math.h> int main() { int i,n; int x,y; int m1,m2,m3,m4; while ...
- 【PSR规范专题(3)】PSR-2 代码风格规范
[PSR规范专题(3)]PSR-2 代码风格规范 标签(空格分隔): PHP 转载自:https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-2-cod ...
- C++:文件的输入和输出
1.共同的打开文件方式: fin.open("test.txt",ios::binary) fout.open("test.txt",ios::binary) ...
- Linux功能-环境变量
linux系统中有很多重要的环境变量,我们可以用env命令查看它们. 变量是由固定的“变量名”与用户或系统设置的“变量值”两部分组成,也可以自行修改. [root@localhost ~]# env ...
- Data Flow ->> Slow Changing Dimension
这里简单讲下SCD 在讲之前贴上两个有用的链接地址.作者的两篇文件讲解了SCD是什么以及应用 http://www.cnblogs.com/biwork/p/3363749.html http://w ...
- HDU 4607 Park Visit 两次DFS求树直径
两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R: ans = ...
- mencoder mencoder 安装使用及常用参数
mencoder 安装及使用 1.安装: 参考:http://hi.baidu.com/putword/item/e5910a187d2aed14e2f9867f 2.合并视频: ...