Php-SPL庫中的迭代器類詳解

SPL提供了多個迭代器類,分別提供了迭代訪問、過濾數據、緩存結果、控制分頁等功能。,因爲php總是在不斷壯大,我儘可能列出SPL中所有的迭代類。下面其中一些迭代器類是需要php5.4,另外一些如SearhIteratoer類在最新的php版本中已經去除

1.ArrayIteratoer

PHP數組創建一個迭代器,當其和IteratorAggregate類一起使用時,免去了直接實現Iterator接口的方法的工作。

<示例>

 

  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

返回給定數量的結果以及從集合中取出結果的起始索引點:

<示例>

 

  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()函數來合併數組。

 

  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

 

  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,支持使用正則表達式模式匹配和修改迭代器中的元素。經常用於將字符串匹配。

 

  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

用來執行提前讀取一個元素的迭代操作,例如可以用於確定當前元素是否爲最後一個元素。

 

  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

用於創建非順序訪問的迭代器,允許跳轉到迭代器中的任何一點上。

 

  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

用於不能多次迭代的集合,適用於在迭代過程中執行一次性操作。

 

  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

用於持續地訪問數據,當迭代到最後一個元素時,會再次從第一個元素開始迭代訪問。

 

  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迭代器。

  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

將一個樹形結構的迭代器展開爲一維結構。

 

  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

以可視在方式顯示一個樹形結構。

 

  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迭代器的非父元素,只找出子節點的鍵值。通俗來說,就是去枝留葉。

 

  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()方法訪問當前正在迭代的迭代器。

 

  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迭代器作爲迭代對象。

 

  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)

同時執行過濾和回調操作,在找到一個匹配的元素之後會調用回調函數。

 

  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

檢查目錄中是否包含更多項

  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

檢查當前位置是否合法

  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的遍歷器

 

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

23. GlobIterator

帶匹配模式的文件遍歷器

  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

用於迭代器的連接器,具體看示例

 

  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迭代器上進行遞歸操作,同時執行過濾和回調操作,在找到一個匹配的元素之後會調用回調函數。

 

  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中所有節點

 

  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

發佈了25 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章