
俗话说的好:从哪里跌倒就从哪里爬起来。想当初,在JavaScript中学了foreach之后,我对它的了解仅局限于“循环遍历”这四个字。在php中再次见到它,我竟然觉得恍若隔世。所以这篇文章我想来写写PHP和JS中的foreach。
一、JavaScript中的foreach
JavaScript 提供了很多个内置对象:Math/Array/Number/String/Boolean等,这些内置对象是带有属性和方法的特殊数据类型。
其中,Array(数组)对象有一个方法forEach,它可以为数组中的每个元素调用定义的回调函数,即对数组中的每个元素执行一次提供的函数。
在JS中,提到数组的循环遍历,最先想到的应该是for循环,即for(var i=0;i<arr.length;i++)这样的方式,也可以用更简便的forEach。示例如下:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script>
var arr = ['好', '好', '学', '习'];
arr.forEach(function(e) {
document.write(e);
})
</script>
</body>
</html>
此时,浏览器界面上展示循环遍历的结果:

在以上的示例中,arr中的元素依次被放入函数中执行输出,实现了数组的循环遍历。
二、PHP中的foreach
1、PHP中的foreach
php 4 引入了 foreach 结构,这只是一种遍历数组简便方法。foreach 仅能用于数组,有以下两种语法:
用法一:
foreach ($arr as $value) statement
第一种格式遍历给定的 arr 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。
用法二:
foreach ($arr as $key => $value) statement
第二种格式与第一种作用相同,只除了当前单元的键名也会在每次循环中被赋给变量 $key。
示例如下:
用法一:
<?php
$arr = array('one', 'two', 'three');
reset($arr);
foreach ($arr as $value) {
echo "Value: $value<br/>";
}
代码运行结果:

用法二:
<?php
$arr = array('one', 'two', 'three');
reset($arr);
foreach ($arr as $key => $value) {
echo "Key: $key; Value: $value<br/>";
}
代码运行结果:

代码执行过程:
1.对所要遍历的数组指针进行重置。
2.获取指针当前所指向的元素的键名与键,并将键名与键值赋值给 $key,与 $value 变量。同时将指针下移一行。
3.重复的进行读取,下移指针的动作。
4.当没有元素可以读取时,会自动结束。
自 php 5 起,还可能遍历对象。在 php 5 中,当 foreach 开始执行时,数组内部的指针会自动指向第一个单元,即在以上两段代码中,不需要执行 reset($arr) 来重置指针的指向。
自 php 5 起,可以很容易地通过在 $value 之前加上 & 来修改数组的单元。此方法将以引用赋值而不是拷贝一个值。
示例如下:
<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
echo "$value";
}
代码运行结果:

2、数组中的指针操作
在PHP的foreach循环遍历中,提到了指针。
php中提供了一套函数,这套函数专用于通过数组的指针来操作数组。
数组在内存中有一个数组指针与之相关,默认这个指针位于第1个元素上。这个指针可以通过php的指针函数来操作。
如下:
key → 获取指针当前所指向元素的键名。
current → 获取指针当前所指向元素的键值。
next → 将指针下移一个元素
prev → 将指针上移一个元素
reset → 将指针重置(回到第1个元素)
示例如下:
<?php
$arr = array('one', 'two', 'three');
echo key($arr),' ',current($arr),'<br/>';
next($arr);
echo key($arr),' ',current($arr),'<br/>';
next($arr);
echo key($arr),' ',current($arr),'<br/>';
next($arr);
var_dump(key($arr));
代码运行结果:
