PHP foreach数组循环的一些问题

foreach 遍历数组
服务器君一共花费了277.279 ms进行了4次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

PHP foreach() 语法结构用于遍历操作或输出数组,foreach() 仅能用于遍历数组或对象,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。

语法:

foreach (array as $value)
    statement
	// 或者:
foreach (array as $key => $value)
    statement

上述语法中,每次循环将当前单元的值赋给 $value 并且数组内部的指针向前移一步。在第二种语法格式中还将当前单元的键名也会在每次循环中赋给变量 $key。

通常循环访问数组都用for循环,例如:

for($i = 0; $i < 3; $i++)
{
	echo $arr[$i];
}

但通过手工代码操作一个大数组来说,用foreach循环的代码更少,上面的代码可以这样写:

foreach ($arr as $value)
{
	echo $value;
}

下面来仔细探讨下foreach使用中的一些问题。

1.foreach 中使用引用的情况。

普通情况下,foreach($arr as $value)中的$arr和$value是拷贝,不受外部影响的,即

$arr = array(0,1,2,3,4,5);

foreach($arr as $value){
	$arr = array();
	echo $value;
}

// 12345

但如果$arr是引用的话,情况则不同了,我们用代码来说明问题

$arr = array(0,1,2,3,4,5);
$arr = &$arr;

foreach($arr as $value){
	$arr = array();
	echo $value;
}

// 0

这是因为循环用的$arr是直接指向原数据的,而不是copy了一份。

如果$value是引用,而$arr不是引用,其结果是一样的,同样$value是指向原数据的而不是copy。

$arr = array(0,1,2,3,4,5);

foreach($arr as &$value){
	$arr = array();
	echo $value;
}

// 结果是: 0

还有一种情况比较特殊,即是如果定义了$arr为全局变量的话,$arr也会变成引用:

global $arr;
$arr = array(0,1,2,3,4,5);

foreach($arr as $value){
	$arr = array();
	echo $value;
}

// 结果是: 0

2. 如果两次循环一个数组,一定不能这样写

foreach($arr as &$value){}
foreach($arr as $value){}

这会导致第二次的循环的结果不正确(可能是php的bug吧)。可以用以下几种来代替:

//solution 1
foreach($arr as &$value){}
unset($value);
foreach($arr as $value){}
//solution 2
foreach($arr as &$value){}
foreach($arr as &$value){}
//solution 3
foreach($arr as &$value){}
$arr2 = $arr;
foreach($arr2 as $value){}

3.防止foreach出现未定义情况,尽量这样来写foreach

foreach((array)$arr as $value) {}

本文地址:http://www.nowamagic.net/librarys/veda/detail/125,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/125

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《敏捷软件开发(原则模式与实践)》 马丁 (作者), 邓辉 (译者)

《敏捷软件开发:原则模式与实践》由享誉全球的软件开发专家和软件工程大师Robert C.Martin将向您展示如何解决软件开发人员、项目经理及软件项目领导们所面临的最棘手的问题。这本综合性、实用性的敏捷开发和极限编程方面的指南,是由敏捷开发的创始人之一所撰写的。1.讲述在预算和实践要求下,软件开发人员和项目经理如何使用敏捷开发完成项目;2.使用真实案例讲解如何用极限编程来设计、测试、重构和结对编程;3.包含了极具价值的可多次使用的C++和JAVA源代码;4.重点讲述了如何使用UML和设计模式解决面向客户系统的问题。

更多计算机宝库...