php 迭代器

?迭代器(Iterator)模式,又叫做游標(Cursor)模式。GOF給出的定義為:提供一種方法訪問一個容器(container)對象中各個元素,而又不需暴露該對象的內部細節。

百度百科:?http://baike.baidu.com/view/9791023.htm?fr=aladdin

解釋

上面這名話可能多數人看得似懂非懂,什么叫做訪問容器的各個元素,又不暴露對象的內部細節呢?尤其是網上很多例子都過于簡單,直接扔一個數組,然后去實現了迭代器的各種方法,如下:

?<?php

class SomeCollection implements Iterator

{

protected $_data;

protected $_pos;

?

function __construct($data)

{

$this->_data = $data;

$this->_pos = 0;

}

?

function current()

{

$row = $this->_data[$this->_pos];

return $row;

}

?

function next()

{

$this->_pos++;

}

?

function valid()

{

return $this->_pos >= 0 && $this->_pos <count($this->_data);

}

?

function key()

{

return $this->_pos;

}

?

function rewind()

{

$this->_pos = 0;

}

}

?

$array = array(

array('url' => 'www.zeroplace.cn'),

array('url' => 'www.baidu.com'),

array('url' => 'www.sina.com.cn'),

array('url' => 'www.google.com'),

array('url' => 'www.qq.com'),

);

?

$coll = new SomeCollection($array);

?

foreach ($coll as $row) {

echo $row['url'], "\n";

}

這樣的例子就不能夠說明迭代器的作用,因為它不能說明迭代器隱藏了內部的數據結構,傳進去的和返回出來的完全是一樣的數據。

迭代器怎么用

我只能說在不同的場合有不同的用法。比如我把上面的例子修改一下,可能就可以說明迭代器可以隱藏數據結構這個特性了。請看如下代碼。

?<?php

class SomeCollection implements Iterator

{

protected $_data;

protected $_pos;

?

function __construct($data)

{

$this->_data = $data;

$this->_pos = 0;

}

?

function current()

{

$row = $this->_data[$this->_pos];

$row['ip'] = gethostbyname($row['url']);

return $row;

}

?

function next()

{

$this->_pos++;

}

?

function valid()

{

return $this->_pos >= 0 && $this->_pos <count($this->_data);

}

?

function key()

{

return $this->_pos;

}

?

function rewind()

{

$this->_pos = 0;

}

}

?

$array = array(

array('url' => 'www.zeroplace.cn'),

array('url' => 'www.baidu.com'),

array('url' => 'www.sina.com.cn'),

array('url' => 'www.google.com'),

array('url' => 'www.qq.com'),

);

?

$coll = new SomeCollection($array);

?

foreach ($coll as $row) {

echo $row['url'], ' ', ?$row['ip'], "\n";

}

這樣我覺得就可以說明迭代器能隱藏數據結構這個特性了。我們的數據傳進去的時候每行數據只有一個url屬性,但是迭代出來的時候多了一個ip屬性。這樣對外部的使用者來說就是有兩個屬性(url和ip), 它不需要知道這個ip字段是創建者傳入的還是在迭代器中產生的。

更一般的做法

這里current方法返回的是一個關聯數組,更常規的做法是返回一個對象,此時這個迭代器可能還需要一個對象創建器。

轉載于:https://www.cnblogs.com/agang-php/p/5909983.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286057.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kotlin和Java混合開發總結(基于Kotlin1.3.0版本)

我本來是不想學習kotlin的&#xff0c;但是現在的形勢&#xff0c;很多公司都在使用kotlin開發&#xff0c;可以說學會kotlin也是無奈之舉&#xff0c;既然是潮流&#xff0c;谷歌也在大力推廣&#xff0c;所以還是只能硬著頭皮逼迫自己學一下&#xff0c;也能更快適應公司的需…

GitHub中watch、star、fork的作用

star 的作用是收藏&#xff0c;目的是方便以后查找。watch 的作用是關注&#xff0c;目的是等作者更新的時候&#xff0c;你可以收到通知。fork 的作用是參與&#xff0c;目的是你增加新的內容&#xff0c;然后 Pull Request&#xff0c;把你的修改和主倉庫原來的內容合并。最早…

【MATLAB統計分析與應用100例】案例015:matlab讀取Excel數據,進行值聚類分析

1. 聚類分析輪廓圖 2. matlab完整代碼 %*****計算例9.1的距離矩陣 x = [1, 2, 6, 8, 11];

C語言試題五十五之m個人的成績存放在score數組中,請編寫函數function,它的功能是:將高于平均分的人數作為函數值返回,將高于平均分的分數放在high所指定的數組中。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 m個人的成…

01超精美漸變色動態背景完整示例【CSS動效實戰(純CSS與JS動效)】

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本節案例如下&#xff08;其他動效篇幅原因逐步講解&#xff0c;歡迎三…

Liferay 用本地私服(nexus) 打包部署Portlet應用

當我們使用搭建一個nexus本地倉庫&#xff0c;并且配置settings.xml來讓應用啟用這個倉庫。我們使用Liferay 6.1.10的archetype來創建liferay portlet, 如下圖&#xff1a; 當我們運行命令mvn package liferay:deploy時&#xff0c;會出現以下錯誤&#xff1a; [DEBUG] Using c…

.NET Core 分布式事務 CAP 發布 6.1 正式版

前言我們很高興宣布 CAP 發布 6.1 版本正式版&#xff0c;在這個版本中我們主要針對目前已經發現的幾個BUG進行了修復了以及添加了一些小特性。那么&#xff0c;接下來我們具體看一下吧。總覽可能有些人還不知道 CAP 是什么&#xff0c;老規矩來一個簡介。CAP地址&#xff1a;h…

【MATLAB統計分析與應用100例】案例016:matlab讀取Excel數據,進行樣品系統聚類分析

1. 聚類分析結果 2. matlab完整代碼 (1)讀取數據,并進行標準化 [X,textdata] = xlsread(examp09_02.xls); % 從Excel文件中讀取數據 X = zscore(X

解決React Native報錯:Error:Found unexpected optical bounds (red pixel)

問題背景 同樣是在升級 gradle plugin V2.2.3 --> gradle plugin V3.0.1后&#xff0c;運行至打包APK期間報錯&#xff1a; Error:found unexpected optical bounds (red pixel) on top border at x14.&#xff08;錯誤&#xff1a;在X14的上邊框上發現意外的光學邊界&am…

C語言試題五十六之計算并輸出給定整數n的所有因子(不包括1與自身)之和。規定n的值不大于1000。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫函數…

webpack 入門

什么是WebPack&#xff0c;為什么要使用它&#xff1f; 為什要使用WebPack 現今的很多網頁其實可以看做是功能豐富的應用&#xff0c;它們擁有著復雜的JavaScript代碼和一大堆依賴包。為了簡化開發的復雜度&#xff0c;前端社區涌現出了很多好的實踐方法 模塊化&#xff0c;讓我…

mysql 列類型

列類型整型 tinyint&#xff0c;smallint&#xff0c;mediumint,int,bigint (可選參數unsigned &#xff0c;&#xff08;M&#xff0c;zerofill&#xff0c;結合使用才有意義&#xff09;)浮點型 float(可選參數D,M) decimal&#xff08;可選參數D&#xff0c;M&#xff09;字…

使用vsftp虛擬用戶實現安全訪問控制

一、ftp連接方式 1、命令連接 ftp在與用戶交互時&#xff0c;首先打開的是TCP的21號端口&#xff0c;建立命令連接&#xff0c;這個連接會始終存在&#xff0c;直到用戶輸入bye的那一刻&#xff0c;才斷開命令連接。 2、數據連接 1&#xff09;主動連接 主動連接是基于TCP21號端…

【前端就業課 第二階段】CSS 零基礎到實戰(04)定位

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 一、定位 定位分為相對定位以及絕對定位。 相對定位可以理解為在 HTM…

Android TextView設置ClickableSpan 點擊結尾空白位置也響應點擊的問題

解決辦法&#xff0c;在后邊緊接著追加一個0寬度字符&#xff1a; builder.append("\u200b"); 相關知識&#xff1a; “\u200b” 為 Unicode Character ‘ZERO WIDTH SPACE’ (U200B)&#xff0c;可用于內容標識&#xff0c;不占位數&#xff08;寬度0&#xff0…

【MATLAB統計分析與應用100例】案例017:matlab讀取Excel數據,進行變量系統聚類分析

1. 變量系統聚類分析結果 2. matlab完整代碼 (1)讀取數據,并轉為距離向量 [X,textdata] = xlsread(examp09_03.xls); % 從Excel文件中讀取數據 y = 1 -

WinForm 之 窗口最小化到托盤及右鍵圖標顯示菜單

日常開發有時候需要實現窗口最小化到系統托盤&#xff0c;本文就來講講該如何實現winfrom最小化到系統托盤&#xff0c;本例子基于VS2019編寫。用C#開發winform桌面程序時&#xff0c;程序啟動后&#xff0c;默認是顯示在桌面而且在任務欄中有對應的圖標。有的時候&#xff0c;…

C語言學習筆記--函數與指針

1. 函數類型 (1)C 語言中的函數有自己特定的類型,這個類型由返回值、參數類型和參數個數共同決定。如 int add(int i,int j)的類型為 int(int,int)。 (2)C 語言中通過 typedef 為函數類型重命名 typedef type name(parameter list);//如 typedef int f(int,int); 2. 函數指針 (…

C語言試題五十七之假定輸入的字符串中只包含字母和*號。請編寫函數function,它的功能是:刪除字符串中所有*號。在編寫函數時,不得使用c語言提供的字符串函數。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 假定輸入的…

Wordpress:將圖片、post等的URL轉換為相對路徑

2019獨角獸企業重金招聘Python工程師標準>>> 例如上傳一張圖片&#xff0c;其地址是可能 http://127.0.0.1/wp-content/uploads/2015/12/1_.png&#xff0c; 問題是如果我們通過其他的電腦通過wordpress主機的公網IP訪問這張圖片時會提示找不到。 最好的處理方法是不…