在PHP中有一些预定义的类,比如迭代器类,有SPL提供。常用的几个类:

  1. Iterator------最基本的迭代器
  2. IteratorAggregate --------可以提供一个迭代器的对象,但它本身并不是一个迭代器
  3. RecursiveIterator----------用来遍历RecursiveIterators
  4. FilterIterator-------可以对数据进行过滤的迭代器,值返回与过滤器想匹配的数据
  5. RegexIterator-------FilterIterator中一个内置的具体实现,他是用正则表达式作为过滤器
  6. MultipeIterator-------可以依次遍历多个迭代的迭代器
  7. LimitIterator--------对其数据子集的迭代进行限制的过滤器(类似于SQL中的LIMIT、OFFSET 和 COUNT)

Iterator 举例:

class BasicIterator implements Iterator{
private $key = 0;
private $data = array(
'hello','world'
); public function __construct(){
$this->key = 0;
} public function rewind(){    //用于将指针重新移到起始位置
$this->key = 0;
} public function current(){   //获取当前位置的值,并赋给foreach 中 $value 位置
return $this->data[$this->key];
} public function key(){      //获取当前的key ,并赋给foreach 中 $key 位置
return $this->key;
} public function next(){    //将指针移到下一个位置
$this->key++;
return true;
} public function valid(){    //foreach循环结束的根据
return isset($this->data[$this->key]);
}
} $iterator = new BasicIterator(); foreach ($iterator as $key => $value) {
echo " ".$key." ".$value."\n";
}
//输出:
0  hello
1  world

RecursiveIterator 举例:

$arr = [
'hello',
['world'],
['how',
['are','you',['THIS','IS THIRD']]
],
'doing'
];    //定义一个多级的数组 $recursive = new RecursiveArrayIterator($arr);  //该迭代器允许在与ArrayIterator相同的方式迭代数组和对象时取消设置和修改值和键。(引用php manual的解释)
$recursiveIterator = new RecursiveIteratorIterator($recursive); //可以用来遍历递归迭代器 foreach($recursiveIterator as $key=>$vlaue){
echo " Depath:".$recursiveIterator->getDepth();
echo " Key:".$key;
echo " Value:".$vlaue.PHP_EOL;
}
输出:
Depath:0    Key:0   Value:hello
Depath:1    Key:0   Value:world
Depath:1    Key:0   Value:how
Depath:2    Key:0   Value:are
Depath:2    Key:1   Value:you
Depath:3    Key:0   Value:THIS
Depath:3    Key:1   Value:IS THIRD
Depath:0    Key:3    Value:doing
FilterIterator  实例:
class EvenFilterIterator extends FilterIterator{

    public function accept(){    //定义过滤规则:过滤key为奇数的元素
$iterator = $this->getInnerIterator();
$key = $iterator->key();
return $key%2==0;
}
} $arr = array('hello','Everybody','I\'m','Amazing','The','Who','Doctor','Lives'); $arrIterator = new ArrayIterator($arr);    //现将定义的数组变成数组迭代对象,
$filter = new EvenFilterIterator($arrIterator);  //这个类只接受迭代对象作为参数,实例化过滤类
 foreach ($filter as $key => $value) { echo " Key:".$key." "; echo " Value:".$value.PHP_EOL; }
输出:
Key:0   Value:hello
Key:2   Value:I'm
Key:4   Value:The
Key:6   Value:Doctor

多个迭代器组合使用:

  

$arr = [
'hello',
['world'],
['how',
['are','you',['THIS','IS THIRD']]
],
'doing'
]; $recursive = new RecursiveArrayIterator($arr);
$recursiveIterator = new RecursiveIteratorIterator($recursive);
$limitIterator = new LimitIterator($recursiveIterator,2,5); foreach ($limitIterator as $key => $value) {
$innerIterator = $limitIterator->getInnerIterator();
echo " Depath:".$innerIterator->getDepth()." ";
echo " Key:".$key." ";
echo " Value:".$value.PHP_EOL;
}
输出:
Depath:1   Key:0   Value:how
Depath:2   Key:0   Value:are
Depath:2   Key:1   Value:you
Depath:3   Key:0   Value:THIS
Depath:3   Key:1   Value:IS THIRD

  

php 迭代器的学习的更多相关文章

  1. CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)

    迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor). 模式角色与结构: 实现代码: using System; us ...

  2. c++ 迭代器失效学习 effective-STL 9条

    https://www.cnblogs.com/newbeeyu/p/6883122.html  结合 effective  STL 条款9 https://www.cnblogs.com/fnlin ...

  3. C++ 迭代器容器学习

    set的一个用法 . difference找差集 union合并set intersection找到交集 #include<iostream> #include<string> ...

  4. Python3学习之路~0 目录

    目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...

  5. STL迭代器

    大部分ACM中使用的都是C/C++语言,但是说到C语言和C++语言的区别,却不知道. C++语言用于竞赛真的是非常方便的,里面有很多函数还有STL这个好东西,比C语言方便,比其他语言好理解. 在C语言 ...

  6. Python 装饰&生成&迭代器

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  7. ES6入门十一:Generator生成器、async+await、Promisify

    生成器的基本使用 生成器 + Promise async+await Promise化之Promisify工具方法 一.生成器的基本使用 在介绍生成器的使用之前,可以简单理解生成器实质上生成的就是一个 ...

  8. 一篇夯实一个知识点系列--python生成

    写在前面 本系列目的:一篇文章,不求鞭辟入里,但使得心应手. 迭代是数据处理的基石,在扫描内存无法装载的数据集时,我们需要一种惰性获取数据的能力(即一次获取一部分数据到内存).在Python中,具有这 ...

  9. python学习笔记之迭代器和函数(第三天)

    一.collection系列: 1.counter计数器 如果counter(dict)是对字典的一个补充,如果counter(list)则是对列表的补充,初步测试对字典的值进行排序. ####### ...

随机推荐

  1. su 和 sudo的区别

    su是一个命令,可切换其他用户进行操作:而 '-' 号则是代表是否完全切换指定的用户环境信息 sudo是一个服务,可通过/etc/sudoers进行配置文件,让被限制的用户只能执行被授予的命令操作.

  2. 学习Puppet(一)

    puppet的入门 1.简介 puppet是一种采用C/S星状结构的linux.Unix平台的集中配置管理系统. puppet拥有自己的语言,可管理配置文件.用户.cron任务.软件包.系统服务等. ...

  3. 运筹学之"连通图"和"最小枝杈树"和"最短路线问题"

    一.连通图 必须每个点都有关系 图1 不算连通图 图2含有圈v1,v2,v5,可优化 图3就是所需的连通图 注意:图>连通图>树 二.最小枝杈树 获取是所有节点的最小值,只要是连通图就好, ...

  4. (原创)[C#] 一步一步自定义拖拽(Drag&Drop)时的鼠标效果:(一)基本原理及基本实现

    一.前言 拖拽(Drag&Drop),属于是极其常用的基础功能. 无论是在系统上.应用上.还是在网页上,拖拽随处可见.同时拖拽时的鼠标效果也很漂亮,像这样: 这样: 还有这样: 等等等等. 这 ...

  5. ubuntu vmware kernel module updater

    Ubuntu 19.04 - VMWare内核模块更新程序问问题 4 3我运行了这个命令: apt-cache search linux-headers-$(uname -r)它返回输出 linux- ...

  6. carsim2016 与 MATLAB2018 联合仿真send to simulink后编译不成功解决方法

    之前使用CarSim8.1和Matlab17b联合仿真时遇到的问题和现在换用Carsim2017之后遇到了不一样的问题.carsim2017界面选择send to simulink 按钮之后,点击运行 ...

  7. simulink中scope图像显示添加图例

    1. 在scope中添加图例 (1)首先打开配置属性(configuration properties),在display下面的show legend前面打钩 这样就允许图例显示出来 (2)对scop ...

  8. 关于CSS的个人理解

    CSS的个人理解 一.概念 层叠样式表,主要由属性和属性值(value)组成.(虽然HTML.CSS对代码大小写不敏感,但是属性和属性值对代码大小写是敏感的) 二.工作方式 1.工作原理 由浏览器将C ...

  9. idea 创建maven web项目部署在 tomcat maven plugin中

    前提:1.安装jdk,多数系统使用jdk1.8.xxx,因此选择下载此版本的居多 2.安装Maven 3.部署到tomcat我们可以有两种方式,一种是利用tomcat插件来进行部署,另一种是下载tom ...

  10. 微信小程序animation动画2种方法

    这里介绍 2 种方法一种是常规的小程序方法操作,另一种是引入动画库 1. 常规动画操作设置 wxml: <view> <view bindtap="clickMe" ...