zoukankan      html  css  js  c++  java
  • 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	%s	%8s	%s
    ",
     6     date("Y/m/d H:i:s",$v->getMtime()),//获得创建时间
     7     $v->isDir()?"<DIR>":"",            //获得是否是目录
     8     number_format($v->getSize()),      //获得文件的大小
     9     $v->getFileName()                  //获得文件名
    10     );
    11 }
  • 相关阅读:
    Android四大组件之BroadcastReceiver
    Android四大组件之Activity详解
    2017-2018-1 20155307 《信息安全系统设计基础》第十周课上未完成补充以及课下IPC作业
    第八周课上额外项目:pwd的实现
    20155307《信息安全系统设计基础》第9周学习总结
    2017-2018-11 20155307刘浩 20155338常胜杰 20155335俞昆 实验三 实时系统实验报告
    20155307 刘浩 信息安全技术(李冬冬) 实验三 数字证书应用 实验报告
    2017-2018-1 20155307 《信息安全系统设计基础》第七周学习总结
    实验二 20155307 20155335 20155338 实验报告 固件程序设计
    (完整!)2017-11-1 第七次 信息安全系统设计基础课 主要内容
  • 原文地址:https://www.cnblogs.com/bwcx/p/spl3.html
Copyright © 2011-2022 走看看