Php-SPL库中的迭代器类详解

来源:互联网 发布:好用的windows笔记本 编辑:程序博客网 时间:2024/05/21 14:01

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

1.ArrayIteratoer

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

<示例>

 

[php] view plaincopy
  1. $b = array
  2.     'name'=> 'mengzhi'
  3.     'age' => '12'
  4.     'city'=> 'shanghai' 
  5. ); 
  6. $a = new ArrayIterator($b); 
  7. $a->append(array
  8.                 'home' => 'china'
  9.                 'work' =>'developer' 
  10.            )); 
  11. $c = $a->getArrayCopy(); 
  12. print_r($a); 
  13. print_r($c); 
  14.  
  15. /**output
  16. ArrayIterator Object
  17. (
  18.     [storage:ArrayIterator:private] => Array
  19.     (
  20.     [name] => mengzhi
  21.             [age] => 12
  22.             [city] => shanghai
  23.             [0] => Array
  24.     (
  25.     [home] => china
  26.                     [work] => developer
  27.                 )

  28.         )

  29. )
  30. Array
  31.     (
  32.     [name] => mengzhi
  33.     [age] => 12
  34.     [city] => shanghai
  35.     [0] => Array
  36.     (
  37.     [home] => china
  38.             [work] => developer
  39.         )

  40. )
  41. **/ 

2. LimitIterator

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

<示例>

 

[php] view plaincopy
  1. // Create an iterator to be limited 
  2. $fruits = new ArrayIterator(array
  3.                                  'apple'
  4.                                  'banana'
  5.                                  'cherry'
  6.                                  'damson'
  7.                                  'elderberry' 
  8.                             )); 
  9. // Loop over first three fruits only 
  10. foreach (new LimitIterator($fruits, 0, 3)as$fruit) { 
  11.     var_dump($fruit); 
  12. echo"\n"
  13. // Loop from third fruit until the end 
  14. // Note: offset starts from zero for apple 
  15. foreach (new LimitIterator($fruits, 2)as$fruit) { 
  16.     print_r($fruit); 
  17.  
  18. /**output
  19. string(5) "apple"
  20. string(6) "banana"
  21. string(6) "cherry"

  22. cherrydamsonelderberry
  23. */ 

3. AppendIterator

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

 

[php] view plaincopy
  1. $array_a = new ArrayIterator(array('a','b', 'c')); 
  2. $array_b = new ArrayIterator(array('d','e', 'f')); 
  3. $iterator = new AppendIterator; 
  4. $iterator->append($array_a); 
  5. $iterator->append($array_b); 
  6. foreach ($iteratoras$current) { 
  7.     echo$current."\n"
  8. /**output
  9. a
  10. b
  11. c
  12. d
  13. e
  14. f
  15. */ 

4. FilterIterator

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

 

[php] view plaincopy
  1. class UserFilter extends FilterIterator 
  2.     private$userFilter
  3.  
  4.     publicfunction __construct(Iterator$iterator, $filter
  5.     { 
  6.         parent::__construct($iterator); 
  7.         $this->userFilter = $filter
  8.     } 
  9.  
  10.     publicfunction accept() 
  11.     { 
  12.         $user = $this->getInnerIterator()->current(); 
  13.         if (strcasecmp($user['name'],$this->userFilter) == 0) { 
  14.             return false; 
  15.         } 
  16.         return true; 
  17.     } 
  18.  
  19. $array = array
  20.     array
  21.         'name' => 'Jonathan'
  22.         'id'   => '5' 
  23.     ), 
  24.     array
  25.         'name' => 'Abdul'
  26.         'id'   => '22' 
  27.     ) 
  28. ); 
  29. $object = new ArrayObject($array); 
  30. //去除掉名为abdul的人员 
  31. $iterator = new UserFilter($object->getIterator(),'abdul'); 
  32. foreach ($iteratoras$result) { 
  33.     echo$result['name']; 
  34.  
  35. /**output
  36. Jonathan
  37. **/ 

5. RegexIterator

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

 

[php] view plaincopy
  1. $a = new ArrayIterator(array('test1','test2', 'test3')); 
  2. $i = new RegexIterator($a,'/^(test)(\d+)/', RegexIterator::REPLACE); 
  3. $i->replacement = '$2:$1'
  4. print_r(iterator_to_array($i)); 
  5.  
  6. /**output
  7. Array
  8. (
  9.     [0] => 1:test
  10.     [1] => 2:test
  11.     [2] => 3:test
  12. )
  13. **/ 

6. IteratorIterator

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

7. CachingIterator

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

 

[php] view plaincopy
  1. $array = array('koala','kangaroo', 'wombat','wallaby', 'emu','kiwi', 'kookaburra','platypus'); 
  2. try { 
  3.     $object = new CachingIterator(new ArrayIterator($array)); 
  4.     foreach ($objectas$value) { 
  5.         echo$value
  6.         if ($object->hasNext()) { 
  7.             echo','
  8.         } 
  9.     } 
  10. catch (Exception $e) { 
  11.     echo$e->getMessage(); 
  12. /**output
  13. koala,kangaroo,wombat,wallaby,emu,kiwi,kookaburra,platypus
  14. **/ 

8. SeekableIterator

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

 

[php] view plaincopy
  1. $array = array("apple","banana", "cherry","damson", "elderberry"); 
  2. $iterator = new ArrayIterator($array); 
  3. $iterator->seek(3); 
  4. echo$iterator->current(); 
  5. /**output
  6. damson
  7. **/ 

9. NoRewindIterator

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

 

[php] view plaincopy
  1. $fruit = array('apple','banana', 'cranberry'); 
  2. $arr = new ArrayObject($fruit); 
  3. $it = new NoRewindIterator($arr->getIterator()); 
  4. echo"Fruit A:\n"
  5. foreach ($itas$item) { 
  6.     echo$item ."\n"
  7.  
  8. echo"Fruit B:\n"
  9. foreach ($itas$item) { 
  10.     echo$item ."\n"
  11. /**output
  12. Fruit A:
  13. apple
  14. banana
  15. cranberry
  16. Fruit B:
  17. **/ 

10. EmptyIterator

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

11. InfiniteIterator

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

 

[php] view plaincopy
  1. $arrayit = new ArrayIterator(array('cat','dog')); 
  2. $infinite = new InfiniteIterator($arrayit); 
  3. $limit = new LimitIterator($infinite, 0, 7); 
  4. foreach ($limitas$value) { 
  5.     echo"$value\n"
  6. /**output
  7. cat
  8. dog
  9. cat
  10. dog
  11. cat
  12. dog
  13. cat
  14. **/ 

12. RecursiveArrayIterator

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

[php] view plaincopy
  1. $fruits = array("a" =>"lemon", "b" =>"orange", array("a" =>"apple", "p" =>"pear")); 
  2. $iterator = new RecursiveArrayIterator($fruits); 
  3. while ($iterator->valid()) { 
  4.     //检查是否含有子节点 
  5.     if ($iterator->hasChildren()) { 
  6.         //输出所以字节点 
  7.         foreach ($iterator->getChildren()as$key => $value) { 
  8.             echo$key .' : ' . $value ."\n"
  9.         } 
  10.     } else
  11.         echo"No children.\n"
  12.     } 
  13.     $iterator->next(); 
  14.  
  15. /**output
  16. No children.
  17. No children.
  18. a : apple
  19. p : pear
  20. **/ 

13. RecursiveIteratorIterator

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

 

[php] view plaincopy
  1. $fruits = array("a" =>"lemon", "b" =>"orange", array("a" =>"apple", "p" =>"pear")); 
  2. $arrayiter = new RecursiveArrayIterator($fruits); 
  3. $iteriter = new RecursiveIteratorIterator($arrayiter); 
  4. foreach ($iteriteras$key =>$value) { 
  5.     $d = $iteriter->getDepth(); 
  6.     echo"depth=$d k=$key v=$value\n"
  7.  
  8. /**output
  9. depth=0 k=a v=lemon
  10. depth=0 k=b v=orange
  11. depth=1 k=a v=apple
  12. depth=1 k=p v=pear
  13. **/ 

14. RecursiveTreeIterator

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

 

[php] view plaincopy
  1. $hey = array("a" =>"lemon", "b" =>"orange", array("a" =>"apple", "p" =>"pear")); 
  2. $awesome = new RecursiveTreeIterator( 
  3.     new RecursiveArrayIterator($hey), 
  4.     null, null, RecursiveIteratorIterator::LEAVES_ONLY 
  5. ); 
  6. foreach ($awesomeas$line
  7.     echo$line . PHP_EOL; 
  8.  
  9. /**output
  10. |-lemon
  11. |-orange
  12.     |-apple
  13.     \-pear
  14. **/ 

 

15. ParentIterator

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

 

[php] view plaincopy
  1. $hey = array("a" =>"lemon", "b" =>"orange", array("a" =>"apple", "p" =>"pear")); 
  2. $arrayIterator = new RecursiveArrayIterator($hey); 
  3. $it = new ParentIterator($arrayIterator); 
  4. print_r(iterator_to_array($it)); 
  5. /**output
  6. Array
  7.     (
  8.     [0] => Array
  9.     (
  10.         [a] => apple
  11.         [p] => pear
  12.     )
  13. )
  14. **/ 

16. RecursiveFilterIterator

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

 

[php] view plaincopy
  1. class TestsOnlyFilter extends RecursiveFilterIterator 
  2.     publicfunction accept() 
  3.     { 
  4.         // 找出含有“叶”的元素 
  5.         return$this->hasChildren() || (mb_strpos($this->current(),"叶") !== FALSE); 
  6.     } 
  7.  
  8. $array = array("叶1",array("李2","叶3", "叶4"),"叶5"); 
  9. $iterator = new RecursiveArrayIterator($array); 
  10. $filter = new TestsOnlyFilter($iterator); 
  11. $filter = new RecursiveIteratorIterator($filter); 
  12. print_r(iterator_to_array($filter)); 
  13. /**output
  14. Array
  15. (
  16.     [0] => 叶1
  17.     [1] => 叶3
  18.     [2] => 叶5
  19. )
  20. **/ 

17. RecursiveRegexIterator

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

 

[php] view plaincopy
  1. $rArrayIterator = new RecursiveArrayIterator(array('叶1',array('tet3','叶4', '叶5'))); 
  2. $rRegexIterator = new RecursiveRegexIterator($rArrayIterator,'/^叶/'
  3.     RecursiveRegexIterator::ALL_MATCHES); 
  4.  
  5. foreach ($rRegexIteratoras$key1 =>$value1) { 
  6.     if ($rRegexIterator->hasChildren()) { 
  7.         // print all children 
  8.         echo"Children: "
  9.         foreach ($rRegexIterator->getChildren()as$key => $value) { 
  10.             echo$value ." "
  11.         } 
  12.         echo"\n"
  13.     } else
  14.         echo"No children\n"
  15.     } 
  16. /**output
  17. No children
  18. Children: 叶4 叶5
  19. **/ 

18. RecursiveCachingIterator

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

 

19. CallbackFilterIterator(PHP5.4)

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

 

[php] view plaincopy
  1. $hey = array("李1", "叶2","叶3", "叶4","叶5", "叶6",); 
  2. $arrayIterator = new RecursiveArrayIterator($hey); 
  3. function isYe($current
  4.     return mb_strpos($current,'叶') !== false; 
  5.  
  6. $rs = new CallbackFilterIterator($arrayIterator,'isYe'); 
  7. print_r(iterator_to_array($rs)); 
  8.  
  9. /**output
  10. Array
  11. (
  12.     [0] => 叶2
  13.     [1] => 叶3
  14.     [2] => 叶4
  15.     [3] => 叶5
  16.     [4] => 叶6
  17. )
  18. **/ 

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

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

[php] view plaincopy
  1. $it = new DirectoryIterator("../"); 
  2. foreach ($itas$file) { 
  3.     //用isDot ()方法分别过滤掉“.”和“..”目录 
  4.     if (!$it->isDot()) { 
  5.         echo$file ."\n"
  6.     } 

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

检查当前位置是否合法

[php] view plaincopy
  1. //列出指定目录中所有文件 
  2. $path = realpath('../'); 
  3. $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); 
  4. foreach ($objectsas$name =>$object) { 
  5.     echo"$name\n"

22. FilesystemIterator

DirectoryIterator的遍历器

 

[php] view plaincopy
  1. $it = new FilesystemIterator('../'); 
  2. foreach ($itas$fileinfo) { 
  3.     echo$fileinfo->getFilename() ."\n"

23. GlobIterator

带匹配模式的文件遍历器

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

24. MultipleIterator

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

 

[php] view plaincopy
  1. $person_id = new ArrayIterator(array('001','002', '003')); 
  2. $person_name = new ArrayIterator(array('张三','李四', '王五')); 
  3. $person_age = new ArrayIterator(array(22, 23, 11)); 
  4. $mit = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC); 
  5. $mit->attachIterator($person_id,"ID"); 
  6. $mit->attachIterator($person_name,"NAME"); 
  7. $mit->attachIterator($person_age,"AGE"); 
  8. echo"连接的迭代器个数:".$mit->countIterators() ."\n"; //3 
  9. foreach ($mitas$person) { 
  10.     print_r($person); 
  11. /**output
  12. Array
  13. (
  14.     [ID] => 001
  15.     [NAME] => 张三
  16.     [AGE] => 22
  17. )
  18. Array
  19. (
  20.     [ID] => 002
  21.     [NAME] => 李四
  22.     [AGE] => 23
  23. )
  24. Array
  25. (
  26.     [ID] => 003
  27.     [NAME] => 王五
  28.     [AGE] => 11
  29. )
  30. **/ 

25. RecursiveCallbackFilterIterator(PHP5.4)

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

 

[php] view plaincopy
  1. function doesntStartWithLetterT($current
  2.     $rs = $current->getFileName(); 
  3.     return$rs[0] !=='T'
  4.  
  5. $rdi = new RecursiveDirectoryIterator(__DIR__); 
  6. $files = new RecursiveCallbackFilterIterator($rdi,'doesntStartWithLetterT'); 
  7. foreach (new RecursiveIteratorIterator($files)as$file) { 
  8.     echo$file->getPathname() . PHP_EOL; 

 

26. SimpleXMLIterator

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

 

[php] view plaincopy
  1. $xml = <<<XML 
  2. <books> 
  3.     <book> 
  4.         <title>PHP Basics</title> 
  5.         <author>Jim Smith</author> 
  6.     </book> 
  7.     <book>XML basics</book> 
  8. </books> 
  9. XML; 
  10. // SimpleXML转换为数组 
  11. function sxiToArray($sxi
  12.     $a = array(); 
  13.     for ($sxi->rewind();$sxi->valid(); $sxi->next()) { 
  14.         if (!array_key_exists($sxi->key(),$a)) { 
  15.             $a[$sxi->key()] =array(); 
  16.         } 
  17.         if ($sxi->hasChildren()) { 
  18.             $a[$sxi->key()][] = sxiToArray($sxi->current()); 
  19.         } else
  20.             $a[$sxi->key()][] =strval($sxi->current()); 
  21.         } 
  22.     } 
  23.     return$a
  24.  
  25. $xmlIterator = new SimpleXMLIterator($xml); 
  26. $rs = sxiToArray($xmlIterator); 
  27. print_r($rs); 
  28. /**output
  29. Array
  30. (
  31.     [book] => Array
  32.         (
  33.             [0] => Array
  34.                 (
  35.                     [title] => Array
  36.                         (
  37.                             [0] => PHP Basics
  38.                         )

  39.                     [author] => Array
  40.                         (
  41.                             [0] => Jim Smith
  42.                         )

  43.                 )

  44.             [1] => XML basics
  45.         )

  46. )
  47. **/ 

转:http://blog.csdn.net/uuleaf/article/details/7635996

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 穷山村的娘和儿子长篇全文阅读 棉花地里弄娘 福林与娘亲怀孕全文下载 和娘亲的故事福林 福林与娘亲出去打工 福林和娘亲共赴云雨 玉玉米米地地日日刘寡 玉米地和娘的民儿 慢点 民儿和娘玉米地的故事 第2段 民儿和娘在玉米地热逼 玉米地民儿与娘故事全文下载 玉米地娘和儿怀子小说 娘亲祖母共夫全集 小说下载 奶奶王珍珠怀孕txt 红高粱九儿玉米地视频 娘亲怀了我的种 民儿和娘玉米地故事 快抽出去外婆会怀孕的 民儿玉米地妈全给你 民儿和娘玉米地的小说 第章母亲播种危险期怀孕 儿子今晚后妈随便你怎么弄说说 同学说要看我骑他妈我说可以 荒村野性全文阅读目录 小成和后妈全文免费阅读文章 小诚和后妈全文免费阅读 娘亲在玉米地河边 我和娘亲玉米 娘亲给儿生个娃大结局 在玉米地插娘亲短文 在玉米地插娘亲电影 王来地里与娘激战2 在玉米地插娘亲播放 孩子别谢了我是你妈 臭小子 别急妈咪又不是不给你 粉嫩娘亲全文阅读全文 你的好粗妈v好痛 乡村孽缘上了王雪琴101一0 乡村小神医之情缠玉米地 乡村孽缘长篇小说全文免费阅读 乡村孽缘王雪琴怀孕是第几章