• 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 }
  • 相关阅读:
    codeforces 689 E. Mike and Geometry Problem 组合数学 优先队列
    01 编程 | 边界问题
    Leetcode 445. 两数相加 II
    Leetcode 485. 最大连续1的个数
    005.字符串输入与字符统计
    Leetcode 002. 两数相加
    000 Python常识与快捷键(未完)
    002 第一个Python简易游戏
    001 Python中的变量和字符串
    004.数组的不同遍历方式
  • 原文地址:https://www.cnblogs.com/bwcx/p/spl3.html
Copyright © 2020-2023  润新知