1. 程式人生 > >php關於Iterator (迭代)

php關於Iterator (迭代)

關於Iterator (迭代)
一. PHP中最簡單的迭代形式是foreach語句.

foreach 可以用於陣列, 例如:
foreach ($arr as $key=>$value) { echo $key.’ ‘.$value.’/n’;}
foreach 也可以用於物件, 例如:
foreach ($obj as $property) {echo $property.’/n’;}
注意: 如果在物件之外用這條語句只能輸出公有的屬性,不能輸出私有的和保護的屬性.

二.以下幾個示例有助於理解iterator, 其中DirectoryIterator, RecursiveDirectoryIterator, LimitIterator都是PHP預定義的iterator類:

示例1 顯示/etc/目錄下的所有檔案(不顯示子目錄下的檔案):

1 $path = new DirectoryIterator(“/etc/”);
2 foreach ( $path as $file ){
3 echo $file .’/n’;
4 }


示例2 顯示/etc/目錄下的巢狀的任意層的子目錄中的所有檔案(顯示出目錄路徑):

1 $path = new RecursiveDirectoryIterator(“/etc/”);
2 foreach ( $path as $file
){
3 echo $file ->getPathname().’/n’;
4 }

示例3 顯示/etc/目錄下的前10個檔案:

1 $path = new LimitIterator(DirectoryIterator(“/etc/”),0,10);
2 foreach ( $path as $file ){
3 echo $file .’/n’;
4 }

從這幾個示例可以看出利用iterator, 程式碼清晰, 程式設計速度快.

三. 簡單原理

1. PHP中將實現了介面Iterator中 的5個方法的類都稱為iterator, 這5個方法是:
current()—返回當前元素值,
key()—返回當前元素的鍵值,
next()—下移一個元素,
valid()—判定是否還有後續元素, 如果有, 返回true,
rewind()—移到首元素.

常用的iterator有: DirectoryIterator, SimpleXMLIterator.

2. 遞迴iterator是實現了介面RecursiveIterator中的hasChildren()和getChildren()方法的類,
例如上面示例2中的RecursiveDirectoryIterator.

3. 示例3中顯示了iterator 的連結, 也就是將一個iterator(可以稱為源iterator)作為另一個iterator(可以稱為目標iterator)的引數, 通常用於資料過濾.
常用的用於連結的iterator是FilterIterator 和LimitIterator.
FilterIterator是一個抽象類, 需要實現它的accept()方法作為過濾資料的規則,
而LimitIterator 是類, 用法是new LimitIterator(源iterator, 起始位, 個數) 用於獲得指定個數的元素.

4. PHP中另提供IteratorAggregate介面, 用於將非iterator的類構造為iterator, 實際是實現該介面中的getIterator()方法.

如:

class sample implements Iterator

{

private $_items = array(1,2,3,4,5,6,7);

public function __construct() {

  ;//void

}

public function rewind() { reset($this->_items); }

public function current() { return current($this->_items); }

public function key() { return key($this->_items); }

public function next() { return next($this->_items); }

public function valid() { return ( $this->current() !== false ); }

}

$sa = new sample();

foreach($sa as $key => $val){

print $key . "=>" .$val;

}

相關推薦

演算法之 和遞迴

在計算機程式設計實現中有常常兩種方法: 一為迭代(iterate);二為遞迴(recursion)。 一、概念區分 迭代:利用已知的變數值,根據遞推公式不斷演進得到變數新值得程式設計思想。 遞迴:是指程式呼叫自身的程式設計思想,即一個函式呼叫本身 如果遞迴是自己呼叫

用程式碼來解釋可性,器,生成器的區別

一. 創造器(creator) 這是我自己造的一個名詞,因為在python術語中,對只實現了__next__()方法的物件,好像沒有任何名分,為了說明,我將只實現了__next__()方法的物件稱為創造器(creator)。 class O_Next: def __init__(se

Python3

Python3 迭代器 說明: 迭代器是一個可以記住遍歷的位置的物件 迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束 迭代器只能往前不會後退 字串,列表或元組物件都可用於建立迭代器 示例1: #!/usr/bin/python # 建立列表 mylis

基於模型融合的推薦系統實現(2):式SVD分解

SVD演算法的原理網路上也有很多,不再細說了,關鍵是我們得到的資料是不完整的資料,所以要算SVD就必須做一次矩陣補全。補全的方式有很多,這裡推薦使用均值補全的方法(用每一行均值和每一列均值的平均來代替空白處),然後可以計算SVD,作PCA分析,然後就可以得到預測結果。 但是我們這裡有

C# 獲取json中某key對應的值,支援

/// <summary> /// 從json中獲取對應key的value值 /// </summary> /// <param name="json字串"></param>

python之路-day11-器閉包

  一 、 函式名的運用   函式名是一個變數,但它是一個特殊的變數,與括號配合可以執行函式的變數。   1、函式名的記憶體地址      def func():     print("呵呵")   print(func)   結果:   <function func at

python學習 day011打卡

本節的主要內容: 1.函式名的使用以及第一類物件 2.閉包 3.迭代器   一.函式名的運用. 函式名是一個變數,但它是一個特殊的變數,與括號配合可以執行函式的變數. 1.函式名的記憶體地址 def func(): print("呵呵") print(fun

day011 函式名的運用,閉包,

主要內容: 1.函式名的使用以及第一類物件 2.閉包 3.迭代器一、函式名的運用 函式名就是變數名,命名規則與變數名一樣。 函式名儲存的是函式的記憶體地址。 1、檢視函式名的記憶體地址 """python def inf(): print("疏影"

day11 Python

迭代器 我們之前一直在用可迭代物件進行迭代操作. 那麼到底什麼是可迭代物件. 本小節主要討論可迭代物件. ⾸先我們先回顧一下⽬前我們所熟知的可迭代物件有哪些: str, list, tuple, dict, set. 那為什麼我們可以稱他們為可迭代物件呢? 因為他們都遵

opencv學習-使用器iterator遍歷

1.Mat Iterator_是一個模板類 2.一個影象迭代器使用如下方式宣告: Mat Iterator_ it;或Mat_::iterator it;【推薦使用】 3.使用常規的begin和end來遍歷所有畫素。 4.模板函式begin,end 5.Mat

javaSE_day10_集合_器_增強for_泛型_List介面_ArrayList_LinkedList_Vector_Set_HashSet_Map__可變引數

1.介紹 集合是一種容器,可以用來儲存多個數據 2.集合和陣列的區別 陣列的長度是固定的,集合的長度是可變的 集合中儲存的元素必須是引用資料型別 3.集合繼承關係 Collection介面為最頂層集合介面了       Collecton介面

8 函式、器、閉包

一 函式 作用:是對程式碼塊進行封裝和定義 形式:def func():        函式體 函式引數的位置關係:位置引數 >  *args > 預設值引數 > **kwargs   函式引數的傳遞:func(*[1,2,3],**{1:2,3:5}

K Best POJ - 3111 (牛頓法)

傳送門 題意:有n個物品的重量和價值分別是wi和vi。從中選出k個物品使得單位重量的價值最大。 題解:先取前k個元素算出S0 =∑(vi/wi) 作為初始值,然後對每一個元素(n個)求yi=vi-s0*wi,對yi從大到小排序,取前k個元素算出S,重複上面的運算(每次迴圈後把S的值賦給S0,

python記錄_day11 閉包

一、第一類物件: 函式名是一個變數,可以當普通變數使用,但它又是一個特殊的變數,與括號配合可以執行函式。 函式名的運用 1、單獨列印是一個記憶體地址 2、可以給其他變數賦值 3、可以作為容器類變數的元素 4、可以作為函式的引數 5、可以作為函式的返回值 二、閉包 如果一個內層函式有對外層函式

python學習筆記:第11天 閉包及

目錄 1. 函式名的使用 2. 閉包 3. 迭代器 1. 函式名的使用 其實函式名也是一個變數,但它是一個比較特殊的變數,與小括號配合可以執行函式的變數: 函式名其實和記憶體一樣,也可以使用print檢視它的記憶體地址: In[22]: def func1(): .

【Python】pop與不能共用

l = [0,1,5,3,2,7,6] for i in range(len(l)): print(i) if l[i]>3: l.pop(i) d=dict() for i in range(10): d[i] = i i=0 for k,

器和分部類

迭代器 迭代器是可以返回相同型別的值的有序序列的一段程式碼,可用作方法,運算子或get訪問器的程式碼體.迭代器程式碼使用yield return語句依次返回每個元素,yield break語句將終止迭代.可以在類中實現多個迭代器,每個迭代器必須像類成員一樣有唯一的名稱,並且可以在foreac

Python遞迴與

1、遞迴與迭代: 遞迴和迭代都是迴圈的一種。簡單地說,遞迴是重複呼叫函式自身實現迴圈。迭代是函式內某段程式碼實現迴圈,而迭代與普通迴圈的區別是:迴圈程式碼中參與運算的變數同時是儲存結果的變數,當前儲存的結果作為下一次迴圈計算的初始值。 遞迴迴圈中,遇到滿足終止條件的情況時逐層返回來結束。迭代則使用計數器結

python之路-day12-器閉包

一、昨日內容回顧   1、函式名   a、函式名是一個變數名   b、可以作為集合類的元素   c、可以作為引數進行傳遞   def func(fun):     fn()   d、可以作為返回值返回   def outer():     def inner():       xxx  

設計模式的藝術 行為型模式之器模式

前言 現在的電視機都配置了一個遙控器,使用者可以通過遙控器去選擇上一個或者下一個臺,我們只需要知道如何使用這個遙控器,而無須關注電視是怎麼把電視訊道放入其中的,在軟體實際的開發中,也有這麼一種類,它儲存著多個成員物件,這些類通常稱為聚合類,對應的物件稱為聚合物件。為了方便操作這些聚合物件,同時可