SPL提供了多个迭代器类,分别提供了迭代访问、过滤数据、缓存结果、控制分页等功能。,因为php总是在不断壮大,我尽可能列出SPL中所有的迭代类。下面其中一些迭代器类是需要php5.4,另外一些如SearhIteratoer类在最新的php版本中已经去除

1.ArrayIteratoer

从PHP数组创建一个迭代器,当其和IteratorAggregate类一起使用时,免去了直接实现Iterator接口的方法的工作。

<示例>

$b = array('name'=> 'mengzhi','age' => '12','city'=> 'shanghai'
);
$a = new ArrayIterator($b);
$a->append(array('home' => 'china','work' => 'developer'));
$c = $a->getArrayCopy();
print_r($a);
print_r($c);/**output
ArrayIterator Object
([storage:ArrayIterator:private] => Array([name] => mengzhi[age] => 12[city] => shanghai[0] => Array([home] => china[work] => developer)))
Array([name] => mengzhi[age] => 12[city] => shanghai[0] => Array([home] => china[work] => developer))
**/

2. LimitIterator

返回给定数量的结果以及从集合中取出结果的起始索引点:

<示例>

// Create an iterator to be limited
$fruits = new ArrayIterator(array('apple','banana','cherry','damson','elderberry'));
// Loop over first three fruits only
foreach (new LimitIterator($fruits, 0, 3) as $fruit) {var_dump($fruit);
}
echo "\n";
// Loop from third fruit until the end
// Note: offset starts from zero for apple
foreach (new LimitIterator($fruits, 2) as $fruit) {print_r($fruit);
}/**output
string(5) "apple"
string(6) "banana"
string(6) "cherry"cherrydamsonelderberry*/

3. AppendIterator

按顺序迭代访问几个不同的迭代器。例如,希望在一次循环中迭代访问两个或者更多的组合。这个迭代器的append方法类似于array_merge()函数来合并数组。

$array_a = new ArrayIterator(array('a', 'b', 'c'));
$array_b = new ArrayIterator(array('d', 'e', 'f'));
$iterator = new AppendIterator;
$iterator->append($array_a);
$iterator->append($array_b);
foreach ($iterator as $current) {echo $current."\n";
}
/**output
a
b
c
d
e
f*/

4. FilterIterator

基于OuterIterator接口,用于过滤数据,返回符合条件的元素。必须实现一个抽象方法accept(),此方法必须为迭代器的当前项返回true或false

class UserFilter extends FilterIterator
{private $userFilter;public function __construct(Iterator $iterator, $filter){parent::__construct($iterator);$this->userFilter = $filter;}public function accept(){$user = $this->getInnerIterator()->current();if (strcasecmp($user['name'], $this->userFilter) == 0) {return false;}return true;}
}$array = array(array('name' => 'Jonathan','id'   => '5'),array('name' => 'Abdul','id'   => '22')
);
$object = new ArrayObject($array);
//去除掉名为abdul的人员
$iterator = new UserFilter($object->getIterator(), 'abdul');
foreach ($iterator as $result) {echo $result['name'];
}/**output
Jonathan
**/

5. RegexIterator

继承FilterIterator,支持使用正则表达式模式匹配和修改迭代器中的元素。经常用于将字符串匹配。

$a = new ArrayIterator(array('test1', 'test2', 'test3'));
$i = new RegexIterator($a, '/^(test)(\d+)/', RegexIterator::REPLACE);
$i->replacement = '$2:$1';
print_r(iterator_to_array($i));/**output
Array
([0] => 1:test[1] => 2:test[2] => 3:test
)**/

6. IteratorIterator

一种通用类型的迭代器,所有实现了Traversable接口的类都可以被它迭代访问。

7. CachingIterator

用来执行提前读取一个元素的迭代操作,例如可以用于确定当前元素是否为最后一个元素。

$array = array('koala', 'kangaroo', 'wombat', 'wallaby', 'emu', 'kiwi', 'kookaburra', 'platypus');
try {$object = new CachingIterator(new ArrayIterator($array));foreach ($object as $value) {echo $value;if ($object->hasNext()) {echo ',';}}
}
catch (Exception $e) {echo $e->getMessage();
}
/**output
koala,kangaroo,wombat,wallaby,emu,kiwi,kookaburra,platypus**/

8. SeekableIterator

用于创建非顺序访问的迭代器,允许跳转到迭代器中的任何一点上。

$array = array("apple", "banana", "cherry", "damson", "elderberry");
$iterator = new ArrayIterator($array);
$iterator->seek(3);
echo $iterator->current();
/**output
damson**/

9. NoRewindIterator

用于不能多次迭代的集合,适用于在迭代过程中执行一次性操作。

$fruit = array('apple', 'banana', 'cranberry');
$arr = new ArrayObject($fruit);
$it = new NoRewindIterator($arr->getIterator());
echo "Fruit A:\n";
foreach ($it as $item) {echo $item . "\n";
}echo "Fruit B:\n";
foreach ($it as $item) {echo $item . "\n";
}
/**output
Fruit A:
apple
banana
cranberry
Fruit B:**/

10. EmptyIterator

一种占位符形式的迭代器,不执行任何操作。当要实现某个抽象类的方法并且这个方法需要返回一个迭代器时,可以使用这种迭代器。

11. InfiniteIterator

用于持续地访问数据,当迭代到最后一个元素时,会再次从第一个元素开始迭代访问。

$arrayit = new ArrayIterator(array('cat', 'dog'));
$infinite = new InfiniteIterator($arrayit);
$limit = new LimitIterator($infinite, 0, 7);
foreach ($limit as $value) {echo "$value\n";
}
/**output
cat
dog
cat
dog
cat
dog
cat**/

12. RecursiveArrayIterator

创建一个用于递归形式数组结构的迭代器,类似于多维数组.它为许多更复杂的迭代器提供了所需的操作,如RecursiveTreeIterator和RecursiveIteratorIterator迭代器。

$fruits = array("a" => "lemon", "b" => "orange", array("a" => "apple", "p" => "pear"));
$iterator = new RecursiveArrayIterator($fruits);
while ($iterator->valid()) {//检查是否含有子节点if ($iterator->hasChildren()) {//输出所以字节点foreach ($iterator->getChildren() as $key => $value) {echo $key . ' : ' . $value . "\n";}} else {echo "No children.\n";}$iterator->next();
}/**output
No children.
No children.
a : apple
p : pear**/

13. RecursiveIteratorIterator

将一个树形结构的迭代器展开为一维结构。

$fruits = array("a" => "lemon", "b" => "orange", array("a" => "apple", "p" => "pear"));
$arrayiter = new RecursiveArrayIterator($fruits);
$iteriter = new RecursiveIteratorIterator($arrayiter);
foreach ($iteriter as $key => $value) {$d = $iteriter->getDepth();echo "depth=$d k=$key v=$value\n";
}/**output
depth=0 k=a v=lemon
depth=0 k=b v=orange
depth=1 k=a v=apple
depth=1 k=p v=pear**/

14. RecursiveTreeIterator

以可视在方式显示一个树形结构。

$hey = array("a" => "lemon", "b" => "orange", array("a" => "apple", "p" => "pear"));
$awesome = new RecursiveTreeIterator(new RecursiveArrayIterator($hey),null, null, RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($awesome as $line)echo $line . PHP_EOL;/**output
|-lemon
|-orange|-apple\-pear**/

15. ParentIterator

是一个扩展的FilterIterator迭代器,它可以过滤掉来自于RecursiveIterator迭代器的非父元素,只找出子节点的键值。通俗来说,就是去枝留叶。

$hey = array("a" => "lemon", "b" => "orange", array("a" => "apple", "p" => "pear"));
$arrayIterator = new RecursiveArrayIterator($hey);
$it = new ParentIterator($arrayIterator);
print_r(iterator_to_array($it));
/**output
Array([0] => Array([a] => apple[p] => pear)
)**/

16. RecursiveFilterIterator

是FilterIterator迭代器的递归形式,也要求实现抽象的accept()方法,但在这个方法中应该使用$this->getInnerIterator()方法访问当前正在迭代的迭代器。

class TestsOnlyFilter extends RecursiveFilterIterator
{public function accept(){// 找出含有“叶”的元素return $this->hasChildren() || (mb_strpos($this->current(), "叶") !== FALSE);}
}$array = array("叶1", array("李2", "叶3", "叶4"), "叶5");
$iterator = new RecursiveArrayIterator($array);
$filter = new TestsOnlyFilter($iterator);
$filter = new RecursiveIteratorIterator($filter);
print_r(iterator_to_array($filter));
/**output
Array
([0] => 叶1[1] => 叶3[2] => 叶5
)
**/

17. RecursiveRegexIterator

是RegexIterator迭代器的递归形式,只接受RecursiveIterator迭代器作为迭代对象。

$rArrayIterator = new RecursiveArrayIterator(array('叶1', array('tet3', '叶4', '叶5')));
$rRegexIterator = new RecursiveRegexIterator($rArrayIterator, '/^叶/',RecursiveRegexIterator::ALL_MATCHES);foreach ($rRegexIterator as $key1 => $value1) {if ($rRegexIterator->hasChildren()) {// print all childrenecho "Children: ";foreach ($rRegexIterator->getChildren() as $key => $value) {echo $value . " ";}echo "\n";} else {echo "No children\n";}
}
/**output
No children
Children: 叶4 叶5 **/

18. RecursiveCachingIterator

在RecursiveIterator迭代器上执行提前读取一个元素的递归操作。

19. CallbackFilterIterator(PHP5.4)

同时执行过滤和回调操作,在找到一个匹配的元素之后会调用回调函数。

$hey = array( "李1", "叶2", "叶3", "叶4", "叶5", "叶6",);
$arrayIterator = new RecursiveArrayIterator($hey);
function isYe($current)
{return mb_strpos($current,'叶') !== false;
}$rs = new CallbackFilterIterator($arrayIterator, 'isYe');
print_r(iterator_to_array($rs));/**output
Array
([0] => 叶2[1] => 叶3[2] => 叶4[3] => 叶5[4] => 叶6
)**/

20. DirectoryIterator

目录文件遍历器

方    法

描    述

DirectoryIterator::getSize

得到文件大小

DirectoryIterator::getType

得到文件类型

DirectoryIterator::isDir

如果当前项是一个目录,返回true

DirectoryIterator::isDot

如果当前项是.或..,返回true

DirectoryIterator::isExecutable

如果文件可执行,返回true

DirectoryIterator::isFile

如果文件是一个常规文件,返回true

DirectoryIterator::isLink

如果文件是一个符号链接,返回true

DirectoryIterator::isReadable

如果文件可读,返回true

DirectoryIterator::isWritable

如果文件可写,返回true

DirectoryIterator::key

返回当前目录项

DirectoryIterator::next

移动到下一项

DirectoryIterator::rewind

将目录指针返回到开始位置

DirectoryIterator::valid

检查目录中是否包含更多项

$it = new DirectoryIterator("../");
foreach ($it as $file) {//用isDot ()方法分别过滤掉“.”和“..”目录if (!$it->isDot()) {echo $file . "\n";}
}

21. RecursiveDirectoryIterator

递归目录文件遍历器,可实现列出所有目录层次结构,而不是只操作一个目录。

方    法

描    述

RecursiveDirectoryIterator::getChildren

如果这是一个目录,为当前项返回一个迭代器

RecursiveDirectoryIterator::hasChildren

返回当前项是否是一个目录而不是.或..

RecursiveDirectoryIterator::key

返回当前目录项的路径和文件名

RecursiveDirectoryIterator::next

移动到下一项

RecursiveDirectoryIterator::rewind

将目录指针返回到开始位置

RecursiveIteratorIterator::current

访问当前元素值

RecursiveIteratorIterator::getDepth

得到递归迭代的当前深度

RecursiveIteratorIterator::getSubIterator

得到当前活动子迭代器

RecursiveIteratorIterator::key

访问当前键

RecursiveIteratorIterator::next

前移到下一个元素

RecursiveIteratorIterator::rewind

将迭代器返回到顶级内层迭代器的第一个元素

RecursiveIteratorIterator::valid

检查当前位置是否合法

//列出指定目录中所有文件
$path = realpath('../');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach ($objects as $name => $object) {echo "$name\n";
}

22. FilesystemIterator

是DirectoryIterator的遍历器

$it = new FilesystemIterator('../');
foreach ($it as $fileinfo) {echo $fileinfo->getFilename() . "\n";
}

23. GlobIterator

带匹配模式的文件遍历器

//找出../目录中.php扩展名的文件
$iterator = new GlobIterator('./*.php');
if (!$iterator->count()) {echo '无php文件';
} else {$n = 0;printf("总计 %d 个php文件\r\n", $iterator->count());foreach ($iterator as $item) {printf("[%d] %s\r\n", ++$n, $iterator->key());}
}
/**output
总计 23 个php文件
[1] .\1.php
[2] .\11.php
[3] .\12.php
[4] .\13.php
[5] .\14.php
[6] .\15.php
[7] .\16.php
[8] .\17.php
[9] .\19.php
[10] .\2.php
[11] .\20.php
[12] .\21.php
[13] .\22.php
[14] .\23.php
[15] .\24.php
[16] .\25.php
[17] .\26.php
[18] .\3.php
[19] .\4.php
[20] .\5.php
[21] .\7.php
[22] .\8.php
[23] .\9.php**/

24. MultipleIterator

用于迭代器的连接器,具体看示例

$person_id = new ArrayIterator(array('001', '002', '003'));
$person_name = new ArrayIterator(array('张三', '李四', '王五'));
$person_age = new ArrayIterator(array(22, 23, 11));
$mit = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
$mit->attachIterator($person_id, "ID");
$mit->attachIterator($person_name, "NAME");
$mit->attachIterator($person_age, "AGE");
echo "连接的迭代器个数:".$mit->countIterators() . "\n"; //3
foreach ($mit as $person) {print_r($person);
}
/**output
Array
([ID] => 001[NAME] => 张三[AGE] => 22
)
Array
([ID] => 002[NAME] => 李四[AGE] => 23
)
Array
([ID] => 003[NAME] => 王五[AGE] => 11
)**/

25. RecursiveCallbackFilterIterator(PHP5.4)

在RecursiveIterator迭代器上进行递归操作,同时执行过滤和回调操作,在找到一个匹配的元素之后会调用回调函数。

function doesntStartWithLetterT($current)
{$rs = $current->getFileName();return $rs[0] !== 'T';
}$rdi = new RecursiveDirectoryIterator(__DIR__);
$files = new RecursiveCallbackFilterIterator($rdi, 'doesntStartWithLetterT');
foreach (new RecursiveIteratorIterator($files) as $file) {echo $file->getPathname() . PHP_EOL;
}

26. SimpleXMLIterator

XMl文档访问迭代器,可实现访问xml中所有节点

$xml = <<<XML
<books><book><title>PHP Basics</title><author>Jim Smith</author></book><book>XML basics</book>
</books>
XML;
// SimpleXML转换为数组
function sxiToArray($sxi)
{$a = array();for ($sxi->rewind(); $sxi->valid(); $sxi->next()) {if (!array_key_exists($sxi->key(), $a)) {$a[$sxi->key()] = array();}if ($sxi->hasChildren()) {$a[$sxi->key()][] = sxiToArray($sxi->current());} else {$a[$sxi->key()][] = strval($sxi->current());}}return $a;
}$xmlIterator = new SimpleXMLIterator($xml);
$rs = sxiToArray($xmlIterator);
print_r($rs);
/**output
Array
([book] => Array([0] => Array([title] => Array([0] => PHP Basics)[author] => Array([0] => Jim Smith))[1] => XML basics))**/

********************************************

* 作者:叶文涛

* 标题:Php-SPL库中的迭代器类详解

* 参考:

*  php手册http://php.net/manual/en/spl.iterators.php

*《PHP高级程序设计:模式、框架和测试》 Kevin McArthur 著 汪泳 等译

******************转载请注明来源 ***************

Php-SPL库中的迭代器类详解相关推荐

  1. Php-SPL库中的迭代器类详解(转)

    SPL提供了多个迭代器类,分别提供了迭代访问.过滤数据.缓存结果.控制分页等功能.,因为php总是在不断壮大,我尽可能列出SPL中所有的迭代类.下面其中一些迭代器类是需要php5.4,另外一些如Sea ...

  2. timm 视觉库中的 create_model 函数详解

    timm 视觉库中的 create_model 函数详解 最近一年 Vision Transformer 及其相关改进的工作层出不穷,在他们开源的代码中,大部分都用到了这样一个库:timm.各位炼丹师 ...

  3. Java中的Runtime类详解

    Java中的Runtime类详解 1.类注释 /**Every Java application has a single instance of class Runtime that allows ...

  4. java configuration类_JAVA中的Configuration类详解

    本文主要研究的是java中的configuration类的用法,涉及maven自动加载,pom.xml配置和简单的java代码,具体如下. properties文件是java平台默认的配置文件格式,其 ...

  5. stringtokenizer java_基于Java中的StringTokenizer类详解(推荐)

    StringTokenizer是字符串分隔解析类型,属于:Java.util包. 1.StringTokenizer的构造函数 StringTokenizer(String str):构造一个用来解析 ...

  6. mbg中的Example类详解

    Mybatis逆向工程中生成的Example类 MyBatis Generator:简称MBG,是一个专门为MyBatis框架使用者定制的代码生成器,可以快速的根据表生成对应的映射文件,接口,以及be ...

  7. js中的Class类详解

    目录 什么是类? 定义一个简单的类 定义一个类为Person,每个Person都会跑,都有名字 看一下Person类 和 Person的实例 但是为什么Person实例多出来的两个属性? new 一个 ...

  8. Java中的Properties类详解Properties配置文件

    1.Properties类是什么? Properties(Java.util.Properties),该类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置文件中很多变量是经常 ...

  9. java中properties类_Java中的Properties类详解

    1.Properties类是什么? Properties(Java.util.Properties),该类主要用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,配置文件中很多变量是经常 ...

  10. java中的example_mybatis中关于example类详解

    这几天刚接触example,很多内容都是破碎的,写一篇文章加深理解. 一.什么是example类 mybatis-generator会为每个字段产生Criterion,为底层的mapper.xml创建 ...

最新文章

  1. A query was run and no Result Maps were found
  2. Nacos简介、下载与配置持久化到Mysql
  3. 无状态Spring安全性第1部分:无状态CSRF保护
  4. python解析二维码_Python二维码生成识别实例详解
  5. c语言中width获取窗体宽度,获取屏幕宽高width(),outerWidth,innerWidth,clientWidth的区别...
  6. 迭代列表不要For循环,这是Python列表推导式最基本的概念
  7. 【招聘】哈工大讯飞联合实验室2022届提前批校园招聘
  8. 40线性映射07——线性变换的矩阵表示、线性变换与基的关系、线性变换坐标间的关系、线性变换在不同基下矩阵之间的关系、相似矩阵
  9. 【转】android开发中如何结束所有的activity
  10. 测试用例的定义,测试用例模板,测试用例的作用,测试用例编写注意事项
  11. WinRAR去广告方法
  12. 【转载】国医大师熊继柏:用中医思维彻底把新冠病毒中医治疗方案说清楚!值得中医人收藏
  13. 互联网家谱受到追捧,传统修谱方式面临淘汰,数字家谱:好用
  14. HNU小学期实训课设
  15. NVR人机界面提示资源不足如何解决
  16. Python —— 魔方方法
  17. [转]在今天这个金钱的社会,如果肆意的由这样的人横行霸道; 何来的“百善孝为先”??!...
  18. 天融信 还有什么型号服务器,天融信日志服务器
  19. AndroidStudio连接第三方模拟器的简易方法
  20. 制作视频倒放特效,几分钟教会你

热门文章

  1. 从“阿里月饼门”看安全
  2. 八种抽样技术的科学指南
  3. 条件概率、联合概率和贝叶斯公式
  4. python识别颜色验证码_用Python识别验证码
  5. The field file exceeds its maximum permitted size of 1048576 bytes
  6. 黑马 docker 学习笔记
  7. 符合规则的c语言常量,c语言常量定义规则知识点总结
  8. Kibana:使用 drilldown 从一个仪表板切换到另外一个仪表板
  9. 全国各省会城市经纬度(包含港澳台)
  10. Ps 2022 版新增功能及改进