php提供了一个语法结构用于遍历数组和对象
foreach
遍历数组用法
1 <php
2 //定义一个数组
3 $arr = array("1","2","3","4","5");
4 //用foreach遍历
5 foreach($arr as $key => $value){
6 echo '键名:'.$key.'键值:'.$value."<br>";
7 }8 ?>
输出结果:
键名:0键值:1
键名:1键值:2
键名:2键值:3
键名:3键值:4
键名:4键值:5
而foreach则不能直接遍历对象里面的属性,需要通过迭代器(预定义接口)
最基本的迭代器接口是Iterator
来看下迭代器的优点:
1.支持多种遍历方式。比如有序列表,我们根据需要提供正序遍历、倒序遍历两种迭代器。用户只需要得到我们的迭代器,就可以对集合执行遍历操作
2.简化了聚合类。由于引入了迭代器,原有的集合对象不需要自行遍历集合元素了
3.增加新的聚合类和迭代器类很方便,两个维度上可各自独立变化
4.为不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上操作
缺点就是迭代器模式将存储数据和遍历数据的职责分离增加新的集合对象时需要增加对应的迭代器类,类的个数成对增加,在一定程度上增加系统复杂度。
它的使用场景,我们可以参考如下几点:
1.访问一个聚合对象内容而无须暴露它的内部显示
2.需要为聚合对象提供多种遍历方式
3.为遍历不同的聚合结构提供一个统一的接口
Iterator里面规范了如下方法:
1 Iterator extends Traversable {
2 /* 方法 */
3 abstract public mixed current ( void )//返回当前元素
4 abstract public scalar key ( void )//返回当前元素的键
5 abstract public void next ( void )//向前移动到下一个元素
6 abstract public void rewind ( void )//返回到迭代器的第一个元素
7 abstract public boolean valid ( void )//检查当前位置是否有效
8 }
要进行遍历的类必须实现Iterator里面的抽象方法。
举个例子
1 class Season implements Iterator{
2 private $position = 0;//指针指向0
3 private $arr = array('春','夏','秋','冬');
4 public function rewind(){
5 return $this -> position = 0;
6 }
7 public function current(){
8 return $this -> arr[$this -> position];
9 }
10 public function key(){
11 return $this -> position;
12 }
13 public function next() {
14 ++$this -> position;
15 }
16
17 public function valid() {
18 return isset($this -> arr[$this -> position]);
19 }
20 }
21 $obj = new Season;
22 foreach ($obj as $key => $value) {
23 echo $key.':'.$value."\n";
24 }
25 ?>
结果:
0:春
1:夏
2:秋
3:冬
php有对数组指针的操作,可不用定义$position
1.key();从关联数组中取得键名,没有取到返回NULL
2.current();返回数组中当前单元
3.next();将数组中的内部指针向前移动一位
4.prev();将数组的内部指针倒回一位
5.reset();将数组的内部指针指向第一个单元
6.end();将数组的内部指针指向最后一个单元
本文详细介绍了PHP中使用foreach语句遍历数组的方法,并深入探讨了如何利用迭代器(Iterator)接口遍历对象,包括其优点、缺点及使用场景。同时,提供了具体的代码示例,展示了如何实现自定义类来支持迭代器功能。
5991

被折叠的 条评论
为什么被折叠?



