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 }