SPL学习笔记(3)---迭代器

一:什么是迭代器

通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历,这种统一的遍历工具我们叫做迭代器。

二:ArrayIterator迭代器

1:Iterator接口

PHP中的迭代器是通过Iterator接口定义的。包括

current()、key()、next()、rewind()、valid()等方法。

2:方法

foreach默认实现了ArrayIterator的接口。但是我们学习这个迭代器,可以实现更加高级的功能。

比如我们要跳过前n个元素,可以用seek(n),比如在遍历之前我们要对数组按照键值进行排序,可以调用asort(),按键名排序用ksort()。

$it = new ArrayIterator ( $fruits ); //ArrayIterator迭代器$it->seek(2);                        //跳过$fruits的前2个元素$it->asort();                        //对数组$fruits按照键值进行排序$it->ksort();                        //对数组$fruits按照键名进行排序

2:代码

 1 <?php
 2 $fruits = array (
 3         "apple" => "apple value",
 4         "orange" => "orange value",
 5         "grape" => "grape value",
 6         "plum" => "plum value"
 7 );
 8
 9 foreach ( $fruits as $k => $v ) {
10     echo $k . "=>" . $v . "<br>";
11 }
12 echo "****use ArrayIterator in foreach****<br>";
13 //这里的foreach和上面的foreach结果一样,上面的foreach默认实现了这个机制
14 $it = new ArrayIterator ( $fruits );//ArrayIterator迭代器16 foreach ( $it as $k => $v ) {
17     echo $k . "=>" . $v . "<br>";
18 }
19 echo "****use ArrayIterator in while****<br>";
20 $it->rewind ();
21 while ( $it->valid () ) {
22     echo $it->key () . "=>" . $it->current () . "<br>";
23     $it->next ();
24 }
25 echo "****use ArrayIterator in seek****<br>";
26 //高级功能,跳过元素
27 $it->rewind ();
28 //跳过第几个元素
29 if ($it->valid ()) {
30     while ( $it->valid () ) {
31         if($it->key()=="orange"){   //跳过第2个元素
32             $it->next();
33         }
34         echo $it->key () . "=>" . $it->current () . "<br>";
35         $it->next ();
36     }
37 }
38 //跳过前几个元素
39 $it->rewind ();
40 if($it->valid()){
41     //跳过前几个元素可以用seek()
42     $it->seek(2);            //跳过前2个元素
43     while($it->valid()){
44         echo $it->key () . "=>" . $it->current () . "<br>";
45         $it->next ();
46     }
47 }
48 //排序功能
49 echo "****use ArrayIterator in ksort****<br>";
50 //通过键名排序
51 $it->rewind ();
52 $it->ksort();
53 if ($it->valid ()) {
54     while ( $it->valid () ) {
55         echo $it->key () . "=>" . $it->current () . "<br>";
56         $it->next ();
57     }
58 }
59 echo "****use ArrayIterator in asort****<br>";
60 //通过键值排序
61 $it->rewind ();
62 $it->asort();
63 if ($it->valid ()) {
64     while ( $it->valid () ) {
65         echo $it->key () . "=>" . $it->current () . "<br>";
66         $it->next ();
67     }
68 }

三:AppendIterator迭代器

1:问题:假设现在有两个数组要遍历出来,但是我不想通过两次foreach遍历出来,想一次遍历出来,怎么办呢?

那么,AppendIterator迭代器就可以使用了。

2:代码加注释

 1 <?php
 2 $arr1=array(‘a‘,‘b‘,‘c‘);
 3 $arr2=array(‘c‘,‘d‘,‘e‘);
 4 $it1=new ArrayIterator($arr1);//使数组成为迭代器
 5 $it2=new ArrayIterator($arr2);//使数组成为迭代器
 6 $it=new AppendIterator();     //创建一个合成迭代器对象
 7 $it->append($it1);           //合成上面的两个迭代器
 8 $it->append($it2);
 9 foreach ($it as $k=>$v){
10     echo $k."=>".$v."<br>";
11 }

四:MultipleIterator迭代器

1:问题:现有两个数组,一个数组里面存的是用户的ID,一个数组里面存的是用户的Name,并且两个数组中的元素一一对应,该如何进行合并呢?

这时候,MultipleIterator迭代器就派上用场了。

2:代码加注释

 1 <?php
 2 $arr1=array(‘1‘,‘2‘,‘3‘);
 3 $arr2=array(‘ERIC‘,‘LIO‘,‘DAVID‘);
 4 $it1=new ArrayIterator($arr1);//创建两个迭代器
 5 $it2=new ArrayIterator($arr2);//创建两个迭代器
 6 //以关联数组的方式聚合
 7 $it=new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);//创建一个迭代器聚合对象,并以关联数组的方式聚合
 8 $it->attachIterator($it1,"ID");//第一个的关联名称为ID
 9 $it->attachIterator($it2,"NAME");//第二个的关联名称为NAME
10 foreach ($it as $v){             //关联结果遍历
11     print_r($v);
12 }
13 //以索引数组的方式聚合
14 $it=new MultipleIterator();
15 $it->attachIterator($it1);
16 $it->attachIterator($it2);
17 foreach ($it as $v){
18     print_r($v);
19 }

五:FileystemIterator迭代器

1:问题:如何实现linux中的ls功能,如何实现Windows中的dir功能?

Windows中的dir命令如图:

二:代码

 1 <?php
 2 date_default_timezone_set("PRC");
 3 $it = new FilesystemIterator ( ‘.‘ );//创建FilesystemIterator迭代器
 4 foreach ( $it as $v ) {
 5     printf("%s\t%s\t%8s\t%s\n",
 6     date("Y/m/d H:i:s",$v->getMtime()),//获得创建时间
 7     $v->isDir()?"<DIR>":"",            //获得是否是目录
 8     number_format($v->getSize()),      //获得文件的大小
 9     $v->getFileName()                  //获得文件名
10     );
11 }
时间: 2024-10-05 23:46:06

SPL学习笔记(3)---迭代器的相关文章

C++学习笔记之迭代器

模板是的算法独立于存储的数据类型,而迭代器使算法独立于使用的容器类型.理解迭代器是理解STL的关键. 迭代器应该具备的特征: (1)应该能够对迭代器进行解除引用的操作,以便能够访问它引用的值.即如果P是一个迭代器,则应该对*P进行定义 (2)应该能够将一个迭代器赋给另一个迭代器.如果P和Q都是迭代器,则应对P=Q定义. (3)应该能够对迭代器进行比较,看它们是否相等.即如果P和Q都是迭代器,则应对P==Q和P!=Q进行定义. (4)应该能够使用迭代器遍历容器中的所有元素,这可以通过迭代器定义的+

SPL学习笔记(1)---概念

一:什么是SPL SPL是Standard PHP Library的缩写,他是用于解决常见问题的接口与类的集合. 常见问题是什么问题呢? 1:数据建模.数据结构. 解决数据如何存储的问题. 2:元素遍历. 数据如何查看的问题. 3:常用方法的统一调用. 通用方法(数组.集合的大小). 自定义遍历. 4:类定义自动装载. SPL框架包括数据结构.迭代器.基础接口.基础函数.异常.其他等. 二:SPL中的常用数据结构 1:什么是数据结构? 数据结构是计算机存储.组织数据的方式.是指相互之间存在一种或

STL学习笔记(迭代器相关辅助函数)

advance()可令迭代器前进 #include <iterator> void advance(InputIterator& pos,Dist n); 面对Random Access(随机存取)迭代器,该函数只是简单的调用pos+=n.而对于其他任何类型的迭代器则调用++pos(--pos)n次. distance()可以处理迭代器之间的距离 #include <iterator> Dist distance(InputIterator pos1,InputIterat

python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: 1 >>> g = (x * x for xin range(10)) 2 >>> g3 <generator object <genexpr> at 0x1022ef630> 此处g就是一个生成器. 迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是gene

SPL学习笔记(2)---类的实现

一:SPL中的双向链表---SplDoublyLinkedList() 双向链表的操作总结 当前节点的操作:rewind() 指向bottom,current() 当前节点,next() 下一个节点,prev() 上一个节点. 增加节点的操作:push()会插入到top.unshift()会插入到bottom. 删除节点的操作:pop() 会删除节点中的top元素.shift() 会删除节点中的bottom元素 定位操作:bottom().top() 特定节点的操作:offsetExsits()

STL学习笔记(迭代器类型)

迭代器类型 迭代器是一种“能够遍历某个序列内的所有元素”的对象.它可以透过与一般指针一致的接口来完成自己的工作. 不同的迭代器具有不同的”能力“(行进和存取能力) Input迭代器 Input迭代器只能一次一个向前读取元素,按此顺序一个个传回元素值. 几乎所有迭代器都具备Input迭代器的能力,而且通常更强.纯粹Input迭代器的一个典型例子就是“从标准输入装置读取数据”的迭代器. 下表列出了Input迭代器的各种操作行为 Output迭代器 Output迭代器和Input迭代器相反,其作用是将

STL学习笔记(迭代器配接器)

Reverse(逆向)迭代器 Reverse迭代器是一种配接器. 重新定义递增运算和递减运算.使其行为正好倒置. 如果你使用这类迭代器,算法将以逆向次序处理元素.所有标准容器都允许使用Reverse迭代器来遍历元素.下面是个例子: 1 #include <iostream> 2 #include <list> 3 #include <algorithm> 4 using namespace std; 5 6 void print(int elem) 7 { 8 cout

Python学习笔记010_迭代器

迭代就类似于循环,每次重复的过程被称为迭代的过程,每次迭代的结果将被用来作为下一次迭代的初始值,提供迭代方法的容器被称为迭代器. 常见的迭代器有 (列表.元祖.字典.字符串.文件 等),通常我们是使用for语句完成迭代 #使用for 迭代字典的例子:>>> links = {"鱼C工作室":"http://www.fishc.com/", "鱼C论坛":"http://bbc.fishc.com"} >

STL学习笔记— —iterator迭代器

头文件 所有的容器都定义了自己的迭代器类型,所以一般情况下,不需要再自己添加迭代器头文件.但是如果要使用一些特殊的迭代器,如反向迭代器,或者一些迭代器辅助函数,那么就需要添加头文件<iterator>. 迭代器类型 类型 能力 提供者 输入迭代器 一次向前读取 istream 输出迭代器 向前写入 ostream,inserter 前向迭代器 向前读取和写入 forward list,unordered containers 双向迭代器 向前和向后的读取和写入 list,set,multise