Home > php教程 > php手册 > PHP foreach数组循环的一些问题

PHP foreach数组循环的一些问题

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-13 09:38:46
Original
932 people have browsed it

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

语法:

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

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

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

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

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

foreach ($arr as $value)
{
	echo $value;
}
Copy after login

下面来仔细探讨下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
Copy after login

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

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

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

// 0
Copy after login

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

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

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

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

// 结果是: 0
Copy after login

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

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

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

// 结果是: 0
Copy after login

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

foreach($arr as &$value){}
foreach($arr as $value){}
Copy after login

这会导致第二次的循环的结果不正确(可能是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){}
Copy after login

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

foreach((array)$arr as $value) {}
Copy after login
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Issues
php data acquisition?
From 1970-01-01 08:00:00
0
0
0
PHP extension intl
From 1970-01-01 08:00:00
0
0
0
How to learn php well
From 1970-01-01 08:00:00
0
0
0
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template