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

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. App网络测试

    弱网测试作为健壮性测试的重要部分,对于移动端测试必不可少. 什么样的网络属于弱网? 小于或等于2G速率的都属于弱网,且随着5G的到来,3G网络速率的降低,未来3G也会逐渐划入弱网的行列. 对于弱网的数 ...

  2. .net 中的 StringBuilder 和 TextWriter 区别

    最近闲来之余,看了一些开源的类库,看到有些类库喜欢用TextWriter类来记录相关的字符串数据,感到比较好奇,为啥不用StringBuilder类对象.于是在网上搜索了一番,总结了相关笔记. Str ...

  3. Kubernetes K8S之Service服务详解与示例

    K8S之Service概述与代理说明,并详解所有的service服务类型与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master Cent ...

  4. Map遍历法则

    /** * 如果既要遍历key又要value,那么建议这种方式,应为如果先获取keySet然后再执行map.get(key),map内部会执行两次遍历. * 一次是在获取keySet的时候,一次是在遍 ...

  5. 2020 计蒜之道 预赛 第三场 石子游戏(简单)(暴力DP)

    石子游戏(简单) 原题链接 思路: 通过形式容易看出是一道DP.其中异或和的情况只有64种,所以我们可以开一维来记录当前异或和的状态. 利用dp[当前位置][异或和][是否选择当前]来进行状态转移.时 ...

  6. javascript操作多选下拉列表

    闲来无事,把javascript操作多选下拉列表有关的操作知识复习了一遍,代码附上 <%-- Created by IntelliJ IDEA. User: Administrator Date ...

  7. 分页查询对象Page

    1 public class Page { 2 //当前页码 3 private Integer pageNo = 1; 4 //每页显示条数 5 private Integer pageSize = ...

  8. Python练习题 045:Project Euler 017:数字英文表达的字符数累加

    本题来自 Project Euler 第17题:https://projecteuler.net/problem=17 ''' Project Euler 17: Number letter coun ...

  9. 第二次UML作业

    博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE1/ 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018S ...

  10. Thinkphp中D方法和M方法的区别

    两者共同点都是实例化模型的,而两者不同点呢?一起来看一下: $User = D('User');括号中的参数User,对应的模型类文件的 \Home\Model\UserModel.class.php ...