当each遇上list 的一些困惑
在看手册函数的时候,看到each,如下:
&$array
)返回数组中当前的键/值对并将数组指针向前移动一步
在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用 reset() 。
然后看例子,
<?php
$foo = array( "bob" , "fred" , "jussi" , "jouni" , "egon" , "marliese" );
$bar = each ( $foo );
print_r ( $bar );
?>
$bar 现在包含有如下的键/值对:
Array
(
[1] => bob
[value] => bob
[0] => 0
[key] => 0
) 注意是键值对的形式,each返回的是一个键值对的数组。这里注意:(在这里,我就有个困惑了,按照list的函数,这怎么能遍历数组?)
[1] => bob
[0] => 0 查看list函数:
$varname
[, mixed $...
] )像 array() 一样,这不是真正的函数,而是语言结构。 list() 用一步操作给一组变量进行赋值。
<?php $info = array( 'coffee' , 'brown' , 'caffeine' ); // 列出所有变量
list( $drink , $color , $power ) = $info ;
echo " $drink is $color and $power makes it special.\n" ; // 列出他们的其中一个
list( $drink , , $power ) = $info ;
echo " $drink has $power .\n" ; // 或者让我们跳到仅第三个
list( , , $power ) = $info ;
echo "I need $power !\n" ; // list() 不能对字符串起作用
list( $bar ) = "abcde" ;
var_dump ( $bar ); // NULL
?>
看到list函数(需要提醒的是,list是一种语言结构!),就更加困惑了,按照list的用法,那么
结合each的用法,例如:
list($kev,$value) = each($foo);
其中 each($foo) 返回的是:
Array
(
[1] => bob
[value] => bob
[0] => 0
[key] => 0
)
那么$keu = bob ,$value = bob !!(显然这是不对的!)
这就应该是错误理解list的内部结构用法导致的!看下面例子:
<?php list($a,$b,,$c)=array(2=>10,3=>20,4=>30,1=>40);
echo $a,'~',$b,'~',$c,'<br />';
//返回notice~40~20
//执行到$a的时候返回给我一个notice:说数组没有0键
?>
为什么会返回这个notice~40~20呢?
这涉及到list的运行机制,list是这么赋值的
首先:不要管右边的数组,看List里面的变量,从左到右应该是 $a = arr[0] $b=arr[1] $c=arr[3]
然后:从右到左开始赋值,赋值的顺序是 $c=arr[3] $b=arr[1] $a=arr[0]
所以$c=20 $b = 40 因为没有arr[0],所以$a给了一个警告。
所以,
$temp = each($foo)
list($kev,$value) = $temp;
$key = $temp[0]=0;
$value = $temp[1]=bob;
到此,each跟list配合遍历数组,就没问题了~附上遍历数组一个例子:
<?php
$fruit = array( 'a' => 'apple' , 'b' => 'banana' , 'c' => 'cranberry' ); reset ( $fruit );
while (list( $key , $val ) = each ( $fruit )) {
echo " $key => $val \n" ;
}
?>
以上输出:
a => apple
b => banana
c => cranberry
当each遇上list 的一些困惑的更多相关文章
- 前端遇上Go: 静态资源增量更新的新实践
前端遇上Go: 静态资源增量更新的新实践https://mp.weixin.qq.com/s/hCqQW1F8FngPPGZAisAWUg 前端遇上Go: 静态资源增量更新的新实践 原创: 洋河 美团 ...
- MVC遇上bootstrap后的ajax表单模型验证
MVC遇上bootstrap后的ajax表单验证 使用bootstrap后他由他自带的样式has-error,想要使用它就会比较麻烦,往常使用jqueyr.validate的话只有使用他自己的样式了, ...
- 敏捷遇上UML-需求分析及软件设计最佳实践(郑州站 2014-6-7)
邀请函: 尊敬的阁下:我们将在郑州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实 ...
- 敏捷遇上UML—软创基地马年大会(广州站 2014-4-19)
我们将在广州为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战技巧. 时间:2 ...
- 敏捷遇上UML——软创基地马年大会(深圳站 2014-3-15)
邀请函: 尊敬的阁下: 我们将在深圳为您奉献高端知识大餐,当敏捷遇上UML,会发生怎样的化学作用呢?首席专家张老师将会为您分享需求分析及软件设计方面的最佳实践,帮助您掌握敏捷.UML及两者相结合的实战 ...
- 初识genymotion安装遇上的VirtualBox问题
想必做过Android开发的都讨厌那慢如蜗牛的 eclipse原生Android模拟器吧! 光是启动这个模拟器都得花上两三分钟,慢慢的用起来手机来调试,但那毕竟不是长久之计,也确实不方便,后来知道了g ...
- SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败解决方案
SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败的问题,可作如下尝试: 更新失败后,在windows的[事件查看器→应用程序]中找到来源为MsiInstaller,事件ID为1 ...
- 当创业遇上O2O,新一批死亡名单,看完震惊了!
当创业遇上O2O,故事就开始了,总投入1.6亿.半年开7家便利店.会员猛增至10万……2015半年过去后,很多故事在后面变成了一场创业“事故”,是模式错误还是烧钱过度?这些项目的失败能给国内创业者带来 ...
- LoadRunner - 当DiscuzNT遇上了Loadrunner(下) (转发)
当DiscuzNT遇上了Loadrunner(下) 在之前的两篇文章中,基本上介绍了如何录制脚本和生成并发用户,同时还对测试报告中的几个图表做了简单的说明.今天这篇文章做为这个系列的最后一篇,将会介绍 ...
随机推荐
- tp中u方法的使用
自学的时候都没怎么使用过该方法,现在刚进入一个新公司参加项目.发现这个方法用的很多,所以记录下来防止以后忘了. U方法用于完成对URL地址的组装,特点在于可以自动根据当前的URL模式和设置生成对应的U ...
- PAT 1059. Prime Factors (25) 质因子分解
题目链接 http://www.patest.cn/contests/pat-a-practise/1059 Given any positive integer N, you are suppose ...
- Hdu1090
#include <stdio.h> int main() { int i,T,a,b; scanf("%d",&T); ;i<T;i++){ scanf ...
- mybatis写demo时遇到的问题
写demo的时候,用mybatis的配置文件链接数据库,始终链接不上,太急人了.仔细查阅,发现在mysql中新增的表没有事务支持.还有就是mysql搜索引擎支持的不对.我换了一下 innodb的引擎, ...
- 转:ReportViewer控件使用方法
a. ReportViewer关联Report1.rdlc的简单呈现b. 对带有报表参数的Report1.rdlc的呈现c. 利用程式生成的DataSet 填充报表d. 调用存储过程 生成DataSe ...
- DDMS files not found:hprof-conv.exe的解决办法
或者是you must restart adb and eclipse这类错误 原因:一般是豌豆荚之类的软件影响的,所以,以后要慎用了. 解决方案:先找一下在sdk\tools目录下是否有hprof- ...
- flappy bird游戏源代码揭秘和下载
转:http://blog.csdn.net/touchsnow/article/details/19071961 背景: 最近火爆全球的游戏flappy bird让笔者叹为观止,于是花了一天的时间山 ...
- Hibernate更新部分字段浅谈
update语句是在Hibernate的Configuration的时候生成的,不能动态改变.为什么update的时候所有的属性都一起update,而不是只更新改变字段,其实这是一个比较值得探讨的问题 ...
- 格而知之9:一些关于GCD的笔记
1.最近在重读当年刚开始学习多线程时的笔记,发觉其中有一些地方还是比较容易模糊,于是整理这篇笔记记录一下. 执行方式和队列 2.队列用来存放管理要执行的任务,它分为并发队列(Concurrent Di ...
- cocos2dx 3.1从零学习(三)——Touch事件(回调,反向传值)
第三讲 Touch 前面两篇我们学习的内容,足够我们做一款简单的小游戏.也能够说,我们已经入门了,能够蹒跚的走路了. 本篇将解说cocos2dx中非常重要的touch回调机制.你肯定记得第一章做定时器 ...