SPL学习笔记(3)---迭代器
来源:互联网 发布:黑页源码大全 编辑:程序博客网 时间:2024/04/29 15:43
一.什么是迭代器
通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历,这种统一的遍历工具我们叫做迭代器。
二.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");//第二个的关联名称为NAMEforeach ($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命令如图:
代码实现:
<?phpdate_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() //获得文件名 );}
0 0
- SPL学习笔记(3)---迭代器
- SPL学习笔记之二:迭代器
- SPL学习笔记之二:迭代器
- SPL学习笔记(1)---概念
- SPL学习笔记(4)---基础接口
- php Spl 学习笔记
- php SPL学习笔记
- SPL学习笔记之一:SPL简介
- SPL标准库学习笔记
- SPL学习笔记(2)---类的实现
- SPL学习笔记(5)---函数的使用
- SPL的常用迭代器(3)
- SPL学习笔记之四:数组重载
- SPL学习笔记之五:异常
- SPL(2)--- ArraryIterator迭代器
- SPL学习笔记之三:文件和目录处理
- PHP学习-Spl学习
- PHP SPL笔记
- 版本常见编译问题汇总
- 欢迎使用CSDN-markdown编辑器
- Internet Explorer 9、10、11兼容性分析处理经验谈
- iOS7初体验(3)——图像资源Images Assets
- html文件上传控件file自定义样式
- SPL学习笔记(3)---迭代器
- Apache Kafka
- 贝塞尔曲线
- CRUSH算法
- 看别人的文章,总结
- Hdu 1059 Dividing【多重背包】
- 页面无法按照样式表进行渲染的诡异问题
- Keybindings in ATOM
- Message Queue - MQ Intro