迭代器(Iterator)的使用

我这里主要讲一下聚合式迭代器(IteratorAggregate)

因为聚合式迭代器和ArrayIterator配合使用可以直接跳过Iterator需要实现的5个方法,实现同样的功能。

1、什么是迭代器?
我的个人理解就是“一个一个数过去”的意思。

2、迭代器的特点:
(1)ArrayIterator允许从PHP数组中创建一个迭代器,ArrayIterator可以直接跳过Iterator需要实现的5个方法,实现同样的功能
(2)当ArrayIterator和IteratorAggregate一起工作的时候,直接免去Iterator创建方法的工作,只需要在实现IteratorAggregate的getIterator()方法的时候,返回一个ArrayIterator接口就好。
(3)IteratorAggregate的c语言实现代码,定义了抽象方法getIterator(),所以实现接口的时候,必须定义该方法。
(4)因为迭代器都实现了遍历接口(Traversable),所以当我们的HeaderCollection类实现了IteratorAggregate类之后,就可以直接使用foreach()遍历$this->_header中的每一个元素了。

3、下面用一个设置http报头的例子来说明迭代器的使用场景。

<?php

/**
* @purpose: 设置获取当前请求的http报头。
* Class HeaderCollection
* @package core\web
*/
class HeaderCollection implements \IteratorAggregate
{
private $_headers = []; public function getIterator()
{
return new \ArrayIterator($this->_headers);
} /**
* @purpose: 获取名称为$name的http报头
* @param string $name 报头名
* @param string $default 当所获取的http报头不存的时候,返回的默认值
* @param bool $first 是否仅仅只返回该报头的第一个值,返回值为一个字符串。如果为flase,将会返回所有,其返回值为一个数组
* @return mixed|string
*/
public function get($name, $default = null, $first = true)
{
$name = strtolower($name);
if(isset($this->_headers[$name])){
return $first ? reset($this->_headers[$name]) : $this->_headers[$name];
}
return $default;
} /**
* @purpose: 设置一个新的http报头
* @param string $name header名称
* @param string $value header的值,
* @return $this
*/
public function set($name, $value = '')
{
$name = strtolower($name);
$this->_headers[$name] = (array) $value;
return $this;
} /**
* @purpose: 设置一个默认的http报头,只有在该http报头不存在的情况下才能设置成功。
* 如果已经有同名的http报头,则新设置的报头将会被忽略掉。
* @param string $name header名称
* @param string $value header的值
* @return $this
*/
public function setDefault($name, $value)
{
$name = strtolower($name);
if(empty($this->_headers[$name])){
$this->_headers[$name][] = $value;
}
return $this;
}
}

使用的时候只需要 new 一个 HeaderCollection 对象,然后使用foreach就可以遍历出所有的header了,代码如下:

$headers = new HeaderCollection();
foreach($headers as $name => $values) {
//所有的http报头的名称都是首字母大写,且多个单词以 - 分隔
$name = str_replace(' ', '-', ucwords(str_replace('-', ' ', $name)));
$replace = true;
foreach($values as $value) {
header("$name: $value", $replace);
$replace = false; //强制使相同的头信息并存
}
}

本文为chrdai工作中的总结,如有转载请注明出处:https://www.cnblogs.com/chrdai/p/10871254.html

迭代器(Iterator)的使用的更多相关文章

  1. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  2. VC++ 迭代器 iterator, const_iterator, const iterator

    迭代器 iterator, const_iterator, const iterator 迭代器iterator的作用类似于指针. (1)iterator只有针对制定<类型>的容器才有效. ...

  3. 迭代器iterator

    现在接着上篇的,写一来标识vector 的元素的对象迭代器iterator: 还是通过具体代码举例: 下面我讲了一个我暑期团队的故事哦~~: #include<iostream> #inc ...

  4. c++中的迭代器 iterator

    迭代器iterator的作用类似于指针. iterator只有针对制定<类型>的容器才有效.例如: vector<int> vec; vector<int>::it ...

  5. Python的迭代器(iterator)和生成器(constructor)

    一.迭代器(iterator) 1.迭代器的概述 在Python中,for循环可以用于Python中的任何类型,包括列表.元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器 ...

  6. 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

    迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...

  7. Java 实现迭代器(Iterator)模式

    类图 /** * 自己定义集合接口, 相似java.util.Collection * 用于数据存储 * @author stone * */ public interface ICollection ...

  8. C++迭代器 iterator【转】

    1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...

  9. Java迭代器Iterator

    之前我们实现了迭代器模式,很多编程语言实际上已经内置了迭代器类,比如Java就为我们实现了迭代器Iterator.我们首先来看Iterator中的源码. 通过JDK源码我们发现Iterator是一个接 ...

  10. 迭代器 Iterator

    迭代器 Iterator 2016-5-7 可以这样说,迭代器统一了对容器的访问方式. 考虑这样的情景:原本是对着List编码,但是后来发现需要把相同的代码用于Set.我们需要一种不关心容器类型 而能 ...

随机推荐

  1. 从程序员小仙飞升上神,java技术开发要如何实现?

    新霸哥是一个专业从事java开发的,近期,新霸哥发现很多的朋友在问,从程序员小仙飞升上神难吗?在此新霸哥将为你详细的介绍,下面新霸哥将从新手入门和老司机进阶多方面详细的为大家介绍一下. 说起java首 ...

  2. django优化--ORM查询

    ORM提供了两个方法用来优化查询效率 1. select_related 有两张表:表结构如下: class Scheme(models.Model): """ 套餐类 ...

  3. 23、GoAccess分析Nginx日志

    1.GoAccess基本概述 GoAccess是一个基于终端的快速日志分析器.其核心思想是实时快速分析和查看Web服务器统计信息. 1.安装简单: 2.操作容易: 3.界面酷炫:  2.GoAcce ...

  4. 外星人电脑出现the system is running in low graphics mode的解决方法

    问题现象: 执行删除GCC5.4.0: sudo  apt-get remove gcc gcc-5重启电脑后,就显示the system is running in low graphics mod ...

  5. react typescript FunctionComponent antd crud

    这个界面跟之前VUE做的一样.并无任何不同之处,只是用react重复实现了一遍. import React, { useState, useEffect } from 'react'; import ...

  6. echo(),print(),print_r()的区别?

    echo可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用.echo是php的内部指令,不是函数, ...

  7. 清北学堂dp图论营游记day2

    上午讲数位dp和背包问题. 先讲背包: 完全背包:换了个顺序: 多重背包: 多重背包优化: 这样把每个物品分成这些组,那么把他们转变成不同的物品,就变成了01背包问题: 滑动窗口取最值问题.单调队列优 ...

  8. 第二章 Vue快速入门-- 15 vue中通过属性绑定为元素设置class类样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. 【SPOJ2371】LIS2

    题目大意:求二维最长上升子序列的长度. 题解: 可以看出,这个问题等价于三维偏序问题. 不过在进行分治的时候要注意,由于 dp 转移是有顺序的,因此只能先处理左半部分,再处理左半部分对右边的贡献,最后 ...

  10. jquery $(".classc",$(".classp"))的含义

    jquery中有一种选择器的写法为:$(".classc",$(".classp")),注意,是$()中又嵌套了一个$(),这种写法的作用类似于$(" ...