当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(下) 在之前的两篇文章中,基本上介绍了如何录制脚本和生成并发用户,同时还对测试报告中的几个图表做了简单的说明.今天这篇文章做为这个系列的最后一篇,将会介绍 ...
随机推荐
- git操作流程
- 解决ScrollView中嵌套ListView滚动效果冲突问题
在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样 式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查, ...
- 使用DBUtils小框架
DBUtils对sqlserver好像支持不怎么好,经常出现问题 比如 三月 14, 2015 10:19:32 上午 com.mchange.v2.log.MLog 信息: MLog clients ...
- opencv学习之旅_绘制跟踪轨迹
如何将运动物体的轨迹画出来 我的想法是先:用CAMSHIFT跟踪物体,这个函数会返回一个track_box,将box的中心提取出来,然后以这个中心在另外的图像上画出来,然后将这张图像处理,提取轮廓,提 ...
- org.quartz.impl.jdbcjobstore.LockException
说明:在使用Tomcat6.0.32+Spring3.05+Quartz1.8.6+Mysql5.5.9 此项目在我本机上没有问题,当我把mysql 脚本导入到服务器上,将数据源配置修改为服务器对应的 ...
- keil TEA
http://bbs.mydigit.cn/read.php?tid=545086 #include "reg52.h" void send_char(unsigned char ...
- MVC之ActionResult
一.所有的Controller都继承自System.Web.Mvc.Controller 目前ASP.NET MVC3默认提供了多种ActionResult的实现,在System.Web.Mvc命名空 ...
- C# ADO基础 SqlHelper
class SqlHelper { //这个是将连接数据库的字符串写到配置文件中的 private static string connStr = ConfigurationManager.Conne ...
- Linq to Sql自动生成实体类重名情况的处理
使用Linq to sql自动生成实体类时,如果要生成多个库的实体类,往往会遇到类名重名的情况,也就是表名重名,这样编译会不通过,这种情况下要在自动生成的实体类文件中(.designer.cs后缀)将 ...
- jquery中使用offset()获得的div的left=0,top=0
写东西的时候要获取div的left和top,但怎么也取不到值都为0,但在chrome的console下是可以取到值的, 瞬间就纳闷了,于是乎就在网上找各种方法,大家一般的问题可能都是要获取的div被隐 ...