在自学PHP的过程中,发现PHP中的foreach与JAVA/C/Python等语言有所区别。
一、正常在JAVA/C/Python中的foreach常用的语法结构都是
foreach(数据类型 变量名 in 数组名)
{
//code;
}
例子:
List<string> myStrings = new List<string>();
// 向列表添加一些字符串元素
myStrings.Add("Google");
myStrings.Add("Runoob");
// 使用 foreach 循环遍历列表中的元素
foreach (string s in myStrings)
{
Console.WriteLine(s);
}
二、而在PHP中的foreach有两种格式
foreach (iterable_expression as $value)
statement
foreach (iterable_expression as $key => $value)
statement
第一种格式遍历给定的 iterable_expression
迭代器。每次循环中,当前单元的值被赋给 $value
。
第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key
。
注意 foreach
不会修改类似 current() 和 key() 函数所使用的数组内部指针。
还能够自定义遍历对象。
<?php
/* foreach 示例 1:仅 value */
$a = array(1, 2, 3, 17);
foreach ($a as $v) {
echo "Current value of \$a: $v.\n";
}
//输出 Current value of $a: 1. Current value of $a: 2. Current value of $a: 3. Current value of $a: 17
/* foreach 示例 2:key 和 value */
$a = array(
"one" => 1,
"two" => 2,
"three" => 3,
"seventeen" => 17
);
foreach ($a as $k => $v) {
echo "\$a[$k] => $v.\n";
}
//输出 $a[one] => 1. $a[two] => 2. $a[three] => 3. $a[seventeen] => 17.
?>
当有同名的数组元素时,就可以使用第二种格式进行遍历。
但是要注意,在php中foreach的循环遍历实际是复制了一个原来的数组。所以若要通过在 $value
之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// 现在 $arr 是 array(2, 4, 6, 8)
unset($value); // 最后取消掉引用
?>
此时,数组最后一个元素的 $value
引用在 foreach
循环之后仍会保留。建议使用 unset() 来将其销毁,不用unset()销毁,会导致内部指针无法回到最初位置。导致后续如果再次遍历该数组可能会出错。