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

PHP foreach数组循环的一些问题

WBOY
Freigeben: 2016-06-13 09:38:46
Original
907 Leute haben es durchsucht

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

语法:

foreach (array as $value)
    statement
	// 或者:
foreach (array as $key => $value)
    statement
Nach dem Login kopieren

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

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

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

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

foreach ($arr as $value)
{
	echo $value;
}
Nach dem Login kopieren

下面来仔细探讨下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
Nach dem Login kopieren

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

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

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

// 0
Nach dem Login kopieren

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

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

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

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

// 结果是: 0
Nach dem Login kopieren

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

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

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

// 结果是: 0
Nach dem Login kopieren

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

foreach($arr as &$value){}
foreach($arr as $value){}
Nach dem Login kopieren

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

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

foreach((array)$arr as $value) {}
Nach dem Login kopieren
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage