通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历,这种统一的遍历工具我们叫做迭代器。

PHP中迭代器是通过Iterator 接口定义的。

ArrayIterator迭代器

foreach 默认实现了ArrayIterator接口,但是通过这个迭代器,可以实现更加高级的功能。

  • seek(),指针定位到某位置,跳过前面 n-1的元素
  • ksort(),对key进行字典序排序
  • asort(),对值进行字典序排序
$arr=array(
'apple' => 'apple value', // position = 0
'orange' => 'orange value', // position = 1
'grape' => 'grape value',
'plum' => 'plum value'
);
$obj=new ArrayObject($arr);
// 生成数组的迭代器
$it =$obj->getIterator();
foreach ($it as $key => $value){
echo $key . ":". $value .'<br />';
} echo '<br />';
// 实现和foreach同样功能
$it->rewind(); // 调用current之前一定要调用rewind
While($it->valid()){ // 判断当前是否为有效数据
echo $it->key().' : '.$it->current().'<br />';
$it->next(); // 千万不能少
} // 实现更复杂功能,跳过某些元素进行打印
$it->rewind();
if ($it->valid()){
$it->seek(1); // position,跳过前面 n-1的元素
While($it->valid()){// 判断当前是否为有效数据
echo $it->key().' : '.$it->current().'<br />';
$it->next(); // 千万不能少
}
} $it->ksort(); // 对key进行字典序排序
//$it->asort(); // 对值进行字典序排序
foreach ($it as $key => $value){
echo $key . ":". $value .'<br />';
}

返回结果:

apple:apple value
orange:orange value
grape:grape value
plum:plum value apple : apple value
orange : orange value
grape : grape value
plum : plum value orange : orange value
grape : grape value
plum : plum value apple:apple value
grape:grape value
orange:orange value
plum:plum value

AppendIterator迭代器

AppendIterator能陆续遍历几个迭代器,按顺序迭代访问几个不同的迭代器。例如希望在一次循环中迭代访问两个或更多的组合

$arr_a = new ArrayIterator(array('a'=> array('a','b'=>234),'b','c'));
$arr_b = new ArrayIterator(array('d','e','f'));
$it = new AppendIterator();
$it->append($arr_a); // 追加数组
$it->append($arr_b); // 追加数组,然后遍历$it
foreach ($it as $key => $value){
print_r($key);
echo '-';
print_r($value);
echo '<br />---------------<br />';
}

返回结果:

a-Array ( [0] => a [b] => 234 )
---------------
0-b
---------------
1-c
---------------
0-d
---------------
1-e
---------------
2-f
---------------

MultipleIterator迭代器

用于把多个Iterator 里面的数据组合成为一个整体来访问

  • Multipleiterator:将多个arrayiterator拼凑起来
  • Appenditerator:将多个arrayiteratorr连接起来
$idIter = new ArrayIterator(array('01','02','03'));
$nameIter = new ArrayIterator(array('张三','李四','王五'));
$ageIter = new ArrayIterator(array('22','23','25'));
$mit = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC); // 按照key关联
$mit->attachIterator($idIter,"ID");
$mit->attachIterator($nameIter,"NAME");
$mit->attachIterator($ageIter,"AGE");
foreach ($mit as $value){
print_r($value);
}

返回结果:

Array
(
[ID] => 01
[NAME] => 张三
[AGE] => 22
)
Array
(
[ID] => 02
[NAME] => 李四
[AGE] => 23
)
Array
(
[ID] => 03
[NAME] => 王五
[AGE] => 25
)

  

PHP SPL标准库-迭代器的更多相关文章

  1. php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便)

    php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便) 一.总结 直接看代码实例,特别方便易懂 thinkphp控制器利眠宁不支持(说明 ...

  2. PHP SPL标准库-接口

    PHP SPL标准库有一下接口: Countable OuterIterator RecursiveIterator SeekableIterator SplObserver SplSubject A ...

  3. c/c++ 标准库 迭代器(iterator)

    c/c++ 标准库 迭代器 begin和end运算符返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator:如果对象不是常量,返回iteraotor 1 ...

  4. PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题)

    PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题) 一.总结 SplStack就是继承双链表(SplDoublyLinkedList)实 ...

  5. PHP的SPL标准库里面的堆(SplHeap)怎么使用

    PHP的SPL标准库里面的堆(SplHeap)怎么使用 一.总结 1.因为SplHeap是抽象类,所以要先继承,实现里面的抽象方法compare后,才能new对象使用. 二.PHP的SPL标准库里面的 ...

  6. 【SPL标准库专题(1)】 SPL简介

    什么是SPL SPL是Standard PHP Library(PHP标准库)的缩写. 根据官方定义,它是"a collection of interfaces and classes th ...

  7. PHP 设计模式 笔记与总结(3)SPL 标准库

    SPL 库的使用(PHP 标准库) 1. SplStack,SplQueue,SplHeap,SplFixedArray 等数据结构类 ① 栈(SplStack)(先进后出的数据结构) index.p ...

  8. PHP的SPL标准库

    1,简介 SPL,全称 Standard PHP Library 中文是 标准PHP类库.是php内置的一些拓展类和拓展接口,其内容包含数据结构.迭代器.接口.异常.SPL函数,文件处理等内容.SPL ...

  9. 【SPL标准库专题(3)】 Classes

    我把SPL分为四个部分:Iterator,Classes,Datastructures,Function:而其中classes是就是做一些类的介绍(Iterator与Datastructures相关的 ...

随机推荐

  1. 我是怎样通过个人项目成长为高级 JavaScript 开发者的

    大道理都是能用三两句话说清的 . 在我开发人员的职业生涯中,最好的决定之一就是不再满足于只做工具的使用者. 我决定创建我自己的工具,并不是为了卖钱,而是要了解这些技术的实际工作方式,并提升我的技术技能 ...

  2. memcached缓存:安装和清缓存

    一.安装步骤: 1.将工具一直解压,解压到最底层的exe目录

  3. 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第二周:(Basics of Neural Network programming)-课程笔记

    第二周:神经网络的编程基础 (Basics of Neural Network programming) 2.1.二分类(Binary Classification) 二分类问题的目标就是习得一个分类 ...

  4. js中的选择排序和冒泡排序

    var arr = [12,25,8,16,14]; console.log("排序前数组,",arr) //选择排序:第一轮,找出数组中最小的数,将第一项和最小的数互换位置.第二 ...

  5. 学习 | mockjs入门

    最近工作有用到mockjs模拟数据,实现前后端分离,今天系统的把mockjs的API都过了一遍,算是入门吧. 什么是mockjs mockjs就是一个模拟数据,生成随机数据,拦截ajax请求. 为什么 ...

  6. 2.1 Spring5源码编译

    一. 准备工作 1. . 编译环境 maven jdk8 idea 2. 编译版本: SpringV5.2.7RELEASE+GradleWapper+jdk1.8.0_131编译 二. 源码下载 g ...

  7. volatile域浅析

    内存模型的相关概念 计算机中执行程序时,每条指令都是在CPU中执行,执行指令的过程必然会涉及到数据的读取和写入.而程序运行时的数据是存放在主存(物理内存)中,由于CPU的读写速度远远高于内存的速度,如 ...

  8. Java随谈(一)魔术数字、常量和枚举

    本文适合对 Java 或 C 有一些了解的用户阅读,推荐阅读时间15分钟. 导言 写这个系列的原因? 我曾经听过一种说法,如果不了解Liunx的网络通讯,就很难理解理解Java的IO:如果不知道Jav ...

  9. LINQ中的OrderBy实现按照两个字段升序、降序排序操作

    在公司或许有这种需求,先根据第一个某个字段按照升序排序,然后如果相同,在按照第二个某个字降序排序,我们该怎么去实现呢? 现在来教教大家分别使用Labmda和LINQ进行这种操作. 1.先按照第一个字段 ...

  10. UnityShader学习笔记- Stencil Buffer

    模板测试(Stencil Test)是现代渲染流水线的一环,其中涉及到的就是模板缓冲(Stencil Buffer),模板缓冲可以用来制作物体的遮罩.轮廓描边.阴影.遮挡显示等等效果 目录 Stenc ...