php 迭代器的学习
在PHP中有一些预定义的类,比如迭代器类,有SPL提供。常用的几个类:
- Iterator------最基本的迭代器
- IteratorAggregate --------可以提供一个迭代器的对象,但它本身并不是一个迭代器
- RecursiveIterator----------用来遍历RecursiveIterators
- FilterIterator-------可以对数据进行过滤的迭代器,值返回与过滤器想匹配的数据
- RegexIterator-------FilterIterator中一个内置的具体实现,他是用正则表达式作为过滤器
- MultipeIterator-------可以依次遍历多个迭代的迭代器
- 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";
}
//输出:
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;
}
输出:
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; }
输出:
多个迭代器组合使用:
$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;
}
输出:
php 迭代器的学习的更多相关文章
- CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)
迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor). 模式角色与结构: 实现代码: using System; us ...
- c++ 迭代器失效学习 effective-STL 9条
https://www.cnblogs.com/newbeeyu/p/6883122.html 结合 effective STL 条款9 https://www.cnblogs.com/fnlin ...
- C++ 迭代器容器学习
set的一个用法 . difference找差集 union合并set intersection找到交集 #include<iostream> #include<string> ...
- Python3学习之路~0 目录
目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...
- STL迭代器
大部分ACM中使用的都是C/C++语言,但是说到C语言和C++语言的区别,却不知道. C++语言用于竞赛真的是非常方便的,里面有很多函数还有STL这个好东西,比C语言方便,比其他语言好理解. 在C语言 ...
- Python 装饰&生成&迭代器
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- ES6入门十一:Generator生成器、async+await、Promisify
生成器的基本使用 生成器 + Promise async+await Promise化之Promisify工具方法 一.生成器的基本使用 在介绍生成器的使用之前,可以简单理解生成器实质上生成的就是一个 ...
- 一篇夯实一个知识点系列--python生成
写在前面 本系列目的:一篇文章,不求鞭辟入里,但使得心应手. 迭代是数据处理的基石,在扫描内存无法装载的数据集时,我们需要一种惰性获取数据的能力(即一次获取一部分数据到内存).在Python中,具有这 ...
- python学习笔记之迭代器和函数(第三天)
一.collection系列: 1.counter计数器 如果counter(dict)是对字典的一个补充,如果counter(list)则是对列表的补充,初步测试对字典的值进行排序. ####### ...
随机推荐
- 讲讲 kafka 维护消费状态跟踪的方法?
大部分消息系统在 broker 端的维护消息被消费的记录:一个消息被分发到 consumer 后 broker 就马上进行标记或者等待 customer 的通知后进行标记.这 样也可以在消息在消费后立 ...
- 关于table表格中点击一个按钮获取该行的某一列的值并将其传到模态框的问题解决
<tbody> {% for item in all_dataset %} <tr> <td>{{ item.nid }}</td> <td> ...
- @Required 注解 ?
这个注解表明 bean 的属性必须在配置的时候设置,通过一个 bean 定义的显式的 属性值或通过自动装配,若@Required 注解的 bean 属性未被设置,容器将抛出 BeanInitializ ...
- 学习heartbeat-01简介
1.Heartbeat介绍 Heartbeat 是一个基于Linux开源的,被广泛使用的高可用集群系统,自1999年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,在行业内 ...
- 运筹学之"简单平均预测法"和"加权滑动平均预测法"和"确定平滑系数"
1.简单滑动平均预测法就是将所有的售价加起来除以总数 665/5=133 2.加权滑动平均预测法:需要将售价分别乘以权之和,并除以权之和 1771/13≈136.23 二.某木材公司销售房架构件,其中 ...
- SQL数据库之“TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)”
一.介绍 样本:TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2) 解析:TIMESTAMPDIFF(格式,开始时间,结束时间) 二.参数解析 格式: ...
- 当心,你搞的Scrum可能是小瀑布
摘要:有的团队刚接触Scrum,一个问题令他们很困扰:迭代初期开发人员的工作较多,测试人员闲着:迭代末期开发人员闲着,测试人员的工作比较多,怎么解决资源等待的问题呢? 本文分享自华为云社区<当心 ...
- Living Documentation
Living Documentation Living documentation in legacy systems Living documentation, which comes from t ...
- 走在 SVG + Low Poly 的路上
随着 SVG 的发展,艺术家和设计师们把越来越多传统设计行业的东西引入了前端, low poly 就是其中之一.那 low poly 强大在哪呢,大家通过下面的图来感受一下. 恰巧我们产品 Logo ...
- vue常用知识点总结
感谢本文引用链接的各位大佬们,小菜鸟我只是个搬运工 1.谈一谈你理解的vue是什么样子的? vue是数据.视图分离的一个框架,让数据与视图间不会发生直接联系.MVVM 组件化:把整体拆分为各个可以复用 ...