SPL学习笔记(3)---迭代器
2016-01-30 15:22
866 查看
一.什么是迭代器
通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历,这种统一的遍历工具我们叫做迭代器。二.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按照键名进行排
实战代码
<?php $fruits = array ( "apple" => "apple value", "orange" => "orange value", "grape" => "grape value", "plum" => "plum value" ); foreach ( $fruits as $k => $v ) { echo $k . "=>" . $v . "<br>"; } echo "****use ArrayIterator in foreach****<br>"; //这里的foreach和上面的foreach结果一样,上面的foreach默认实现了这个机制 $it = new ArrayIterator ( $fruits );//ArrayIterator迭代器16 foreach ( $it as $k => $v ) { echo $k . "=>" . $v . "<br>"; } echo "****use ArrayIterator in while****<br>"; $it->rewind (); while ( $it->valid () ) { echo $it->key () . "=>" . $it->current () . "<br>"; $it->next (); } echo "****use ArrayIterator in seek****<br>"; //高级功能,跳过元素 $it->rewind (); //跳过第几个元素 if ($it->valid ()) { while ( $it->valid () ) { if($it->key()=="orange"){ //跳过第2个元素 $it->next(); } echo $it->key () . "=>" . $it->current () . "<br>"; $it->next (); } } //跳过前几个元素 $it->rewind (); if($it->valid()){ //跳过前几个元素可以用seek() $it->seek(2); //跳过前2个元素 while($it->valid()){ echo $it->key () . "=>" . $it->current () . "<br>"; $it->next (); } } //排序功能 echo "****use ArrayIterator in ksort****<br>"; //通过键名排序 $it->rewind (); $it->ksort(); if ($it->valid ()) { while ( $it->valid () ) { echo $it->key () . "=>" . $it->current () . "<br>"; $it->next (); } } echo "****use ArrayIterator in asort****<br>"; //通过键值排序 $it->rewind (); $it->asort(); if ($it->valid ()) { while ( $it->valid () ) { echo $it->key () . "=>" . $it->current () . "<br>"; $it->next (); } }
三.AppendIterator迭代器
1:问题:假设现在有两个数组要遍历出来,但是我不想通过两次foreach遍历出来,想一次遍历出来,怎么办呢?那么,AppendIterator迭代器就可以使用了。
2:代码实现
<?php $arr1=array('a','b','c'); $arr2=array('c','d','e'); $it1=new ArrayIterator($arr1);//使数组成为迭代器 $it2=new ArrayIterator($arr2);//使数组成为迭代器 $it=new AppendIterator(); //创建一个合成迭代器对象 $it->append($it1); //合成上面的两个迭代器 $it->append($it2); foreach ($it as $k=>$v){ echo $k."=>".$v."<br>"; }
四.MultipleIterator迭代器
1:问题:现有两个数组,一个数组里面存的是用户的ID,一个数组里面存的是用户的Name,并且两个数组中的元素一一对应,该如何进行合并呢?这时候,MultipleIterator迭代器就派上用场了。
2:代码实现
<?php $arr1=array('1','2','3'); $arr2=array('ERIC','LIO','DAVID'); $it1=new ArrayIterator($arr1);//创建两个迭代器 $it2=new ArrayIterator($arr2);//创建两个迭代器 //以关联数组的方式聚合 $it=new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);//创建一个迭代器聚合对象,并以关联数组的方式聚合 $it->attachIterator($it1,"ID");//第一个的关联名称为ID $it->attachIterator($it2,"NAME");//第二个的关联名称为NAME foreach ($it as $v){ //关联结果遍历 print_r($v); } //以索引数组的方式聚合 $it=new MultipleIterator(); $it->attachIterator($it1); $it->attachIterator($it2); foreach ($it as $v){ print_r($v); }
五.FileystemIterator迭代器
1:问题:如何实现linux中的ls功能,如何实现Windows中的dir功能?Windows中的dir命令如图:
代码实现:
<?php date_default_timezone_set("PRC"); $it = new FilesystemIterator ( '.' );//创建FilesystemIterator迭代器 foreach ( $it as $v ) { printf("%s\t%s\t%8s\t%s\n", date("Y/m/d H:i:s",$v->getMtime()),//获得创建时间 $v->isDir()?"<DIR>":"", //获得是否是目录 number_format($v->getSize()), //获得文件的大小 $v->getFileName() //获得文件名 ); }
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- 设计模式之行为型模式 - 调用行为的传递问题
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- Ruby中的迭代器详解
- Ruby中Block和迭代器的使用讲解
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- Lua中的迭代器浅析
- Lua中的迭代器和泛型for介绍
- PHP 5.3.0 安装分析心得