首頁 後端開發 php教程 php-SPL库迭代器类

php-SPL库迭代器类

Jun 20, 2016 pm 12:35 PM

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 ($iteratoras$current) {         echo$current."\n";     }     /**output    a    b    c    d    e    f     */ 4. FilterIterator基于OuterIterator接口,用于过滤数据,返回符合条件的元素。必须实现一个抽象方法accept(),此方法必须为迭代器的当前项返回true或false     class UserFilter extends FilterIterator     {         private$userFilter;              publicfunction __construct(Iterator $iterator, $filter)         {             parent::__construct($iterator);             $this->userFilter = $filter;         }              publicfunction 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 ($iteratoras$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 ($objectas$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 ($itas$item) {         echo$item . "\n";     }          echo"Fruit B:\n";     foreach ($itas$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 ($limitas$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 ($iteriteras$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 ($awesomeas$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     {         publicfunction 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 ($rRegexIteratoras$key1 => $value1) {         if ($rRegexIterator->hasChildren()) {             // print all children             echo"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	如果当前项是一个目录,返回trueDirectoryIterator::isDot	如果当前项是.或..,返回trueDirectoryIterator::isExecutable	如果文件可执行,返回trueDirectoryIterator::isFile	如果文件是一个常规文件,返回trueDirectoryIterator::isLink	如果文件是一个符号链接,返回trueDirectoryIterator::isReadable	如果文件可读,返回trueDirectoryIterator::isWritable	如果文件可写,返回trueDirectoryIterator::key	返回当前目录项DirectoryIterator::next	移动到下一项DirectoryIterator::rewind	将目录指针返回到开始位置DirectoryIterator::valid	检查目录中是否包含更多项    $it = new DirectoryIterator("../");     foreach ($itas$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 ($objectsas$name => $object) {         echo"$name\n";     } 22. FilesystemIterator是DirectoryIterator的遍历器     $it = new FilesystemIterator('../');     foreach ($itas$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 ($iteratoras$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 ($mitas$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. SimpleXMLIteratorXMl文档访问迭代器,可实现访问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            )    )     **/ 
登入後複製

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

See all articles