php迭代器的內部執行過程詳解,php迭代器的內部執行過程詳解

本文目錄一覽:

在PHP中遍歷對象用什麼?

其實百度一下就知道

我們知道,php中,foreach可以很方便地對可迭代結構(例如數組,再如對象)進行迭代操作:

[php] view plaincopy

foreach( $array as $elem){

var_dump($elem);

}

[php] view plaincopy

foreach($obj as $key=$value){

echo “$key=$value”.PHP_EOL;

}

因而我們想:如果對於一個實例化對象,對其進行foreach操作,會發生什麼事情呢?

首先我們定義的基礎類為:

[php] view plaincopy

Class Test{

/* one public variable */

public $a;

public $b;

/* one private variable */

private $c;

public function __construct(){

$this-a = “public”;

$this-b = “public”;

$this-c = “private”;

}

public function traverseInside(){

foreach($this as $key=$value){

echo $key.”=”.$value.EOL;

}

}

}

然後我們實例化該類,對其進行迭代,並與內部迭代的結果進行比較:

[php] view plaincopy

$test = new Test;

echo “hr”;

echo “traverse outside:”.EOL;

foreach( $test as $key=$value ){

echo $key.”=”.$value.EOL;

}

echo “hr”;

echo “traverse inside:”.EOL;

$test-traverseInside();

迭代的結果為:

可以看出:外部foreach循環的結果,只是將對象的公有屬性(public)循環出來了,而對於私有屬性(private),外部foreach是無法循環出來的。因而我們如果想要在外部通過foreach循環出類的所有的屬性(公有的和私有的),僅僅依靠foreach是不行的,必須要對類進行「改造」。如何對類進行改造呢?如果你了解foreach的實現(參考laruence的博客:),那麼可以很輕鬆地找到相應的方案。另外一方面,《設計模式-可復用面向對象軟體設計的基礎》中也提到:通過將對象的訪問和遍歷從對象中分離出來並放入一個迭代器對象中,迭代器模式可以實現以不同的方式對對象進行遍歷。我們暫時不去深挖這句話的意思,只要知道,使用迭代器可以對對象進行遍歷即可。

PHP手冊預定義介面部分指出:要實現迭代器模式,需要在可迭代對象中實現如下介面:

[php] view plaincopy

abstractpublicmixedcurrent( void )

abstractpublicscalarkey( void )

abstractpublicvoidnext( void )

abstractpublicvoidrewind( void )

abstractpublicbooleanvalid( void )

有了這個。實現迭代器模式就很方便了,一個簡單的實例如下:

[php] view plaincopy

class TestIterator implements Iterator {

private $point = 0;

private $data = array(

“one”,”two”,”three”,

);

public function __construct() {

$this-point = 0;

}

function rewind() {

$this-point = 0;

}

function current() {

return $this-data[$this-point];

}

function key() {

return $this-point;

}

function next() {

++$this-point;

}

function valid() {

return isset($this-data[$this-point]);

}

}

$it = new TestIterator;

foreach($it as $key = $value) {

echo $key, $value;

echo “\n”;

}

當然,使用了迭代器的對象可以以如下方式進行遍歷:

[php] view plaincopy

$it = new TestIterator;

$it-rewind();

while ($it-valid()){

$key = $it-key();

$value = $it-current();

echo “$key=$value”;

$it-next();

}

最後附上YII中ListIterator(顧名思義,實現對List的迭代操作的迭代器)的實現:

[php] view plaincopy

?php

/**

* CListIterator class file.

*

* @author Qiang Xue qiang.xue@gmail.com

* @link

* @copyright Copyright © 2008-2011 Yii Software LLC

* @license

*/

/**

* CListIterator implements an interator for {@link CList}.

*

* It allows CList to return a new iterator for traversing the items in the list.

*

* @author Qiang Xue qiang.xue@gmail.com

* @version $Id$

* @package system.collections

* @since 1.0

*/

class CListIterator implements Iterator

{

/**

* @var array the data to be iterated through

*/

private $_d;

/**

* @var integer index of the current item

*/

private $_i;

/**

* @var integer count of the data items

*/

private $_c;

/**

* Constructor.

* @param array $data the data to be iterated through

*/

public function __construct($data)

{

$this-_d=$data;

$this-_i=0;

$this-_c=count($this-_d);

}

/**

* Rewinds internal array pointer.

* This method is required by the interface Iterator.

*/

public function rewind()

{

$this-_i=0;

}

/**

* Returns the key of the current array item.

* This method is required by the interface Iterator.

* @return integer the key of the current array item

*/

public function key()

{

return $this-_i;

}

/**

* Returns the current array item.

* This method is required by the interface Iterator.

* @return mixed the current array item

*/

public function current()

{

return $this-_d[$this-_i];

}

/**

* Moves the internal pointer to the next array item.

* This method is required by the interface Iterator.

*/

public function next()

{

$this-_i++;

}

/**

* Returns whether there is an item at current position.

* This method is required by the interface Iterator.

* @return boolean

*/

public function valid()

{

return $this-_i$this-_c;

}

}

php迭代器iterator怎麼用

使用foreach 與使用迭代器,並不衝突 

迭代器可以使用在:

1、使用返回迭代器的包或庫時(如PHP5中的SPL迭代器)

2、無法在一次的調用獲取容器的所有元素時

3、要處理數量巨大的無素時(資料庫中的表以GB計的數據)

迭代器還可以用來構造一些數據結構。

你可以去後盾人平台看看,裡面的東西不錯

迭代器是什麼

迭代器(iterator)有時又稱游標(cursor)是程序設計的軟體設計模式,可在容器(container,例如鏈表或陣列)上遍訪的介面,設計人員無需關心容器的內容。

迭代器(iterator)是一種對象,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器對象代表容器中的確定的地址。迭代器修改了常規指針的介面,所謂迭代器是一種概念上的抽象:那些行為上像迭代器的東西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用演算法有機的統一起來。

迭代器提供一些基本操作符:*、++、==、!=、=。這些操作和C/C++「操作array元素」時的指針介面一致。不同之處在於,迭代器是個所謂的複雜的指針,具有遍歷複雜數據結構的能力。其下層運行機製取決於其所遍歷的數據結構。因此,每一種容器型都必須提供自己的迭代器。事實上每一種容器都將其迭代器以嵌套的方式定義於內部。因此各種迭代器的介面相同,型號卻不同。這直接導出了泛型程序設計的概念:所有操作行為都使用相同介面,雖然它們的型別不同。

功能

迭代器使開發人員能夠在類或結構中支持foreach迭代,而不必整個實現IEnumerable或者IEnumerator介面。只需提供一個迭代器,即可遍歷類中的數據結構。當編譯器檢測到迭代器時,將自動生成IEnumerable介面或者IEnumerator介面的Current,MoveNext和Dispose方法。

特點

1.迭代器是可以返回相同類型值的有序序列的一段代碼;

2.迭代器可用作方法、運算符或get訪問器的代碼體;

3.迭代器代碼使用yieldreturn語句依次返回每個元素,yield break將終止迭代;

4.可以在類中實現多個迭代器,每個迭代器都必須像任何類成員一樣有惟一的名稱,並且可以在foreach語句中被客戶端,代碼調用如下所示:foreach(int x in SimpleClass.Iterator2){};

5.迭代器的返回類型必須為IEnumerable和IEnumerator中的任意一種;

6.迭代器是產生值的有序序列的一個語句塊,不同於有一個 或多個yield語句存在的常規語句塊;

7.迭代器不是一種成員,它只是實現函數成員的方式,理解這一點是很重要的,一個通過迭代器實現的成員,可以被其他可能或不可能通過迭代器實現的成員覆蓋和重載;

8.迭代器塊在C#語法中不是獨特的元素,它們在幾個方面受到限制,並且主要作用在函數成員聲明的語義上,它們在語法上只是語句塊而已;

9.yield關鍵字用於指定返回的值。到達yieldreturn語句時,會保存當前位置。下次調用迭代器時將從此位置重新開始執行。 迭代器對集合類特別有用,它提供一種簡單的方法來迭代不常用的數據結構(如二進位樹)。

php:我是Php新手下面這個數組排序看不大懂,求高手指點啊

$users 內部有一個迭代器。

reset 使這個迭代器重新開始迭代,

key 取得這個迭代器的當前位置上的鍵(即數組的下標)

next 將這個迭代器移動到下一個位置。

這兩個循環是一樣的,通過使用迭代器對數組遍歷,並逐個輸出元素的內容。

誰能幫我講解一下這段php PDO的代碼

1 RecursiveArrayIterator迭代器

這個迭代器允許設置和修改值和鍵時遍曆數組和對象在相同的方式,ArrayIterator。此外,可以迭代當前迭代器條目。

2 LEAVES_ONLY  只迭代當前葉子節點

mode

Optional mode. Possible values are

RecursiveIteratorIterator::LEAVES_ONLY – The default. Lists only leaves in iteration.

RecursiveIteratorIterator::SELF_FIRST – Lists leaves and parents in iteration with parents coming first.

RecursiveIteratorIterator::CHILD_FIRST – Lists leaves and parents in iteration with leaves coming first.

3 迭代器對象 已經設置好表格樣式

4 迭代器對象循環輸出顯示

current 迭代器當前指向的葉子結點

總結  :  TableRows 類繼承 RecursiveArrayIterator ,重新設置每個children 與 葉子結點 的左右樣式(這裡表格),然後通過sql語句,查找資料庫,循環迭代器對象輸出顯示。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/259365.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 16:28
下一篇 2024-12-15 16:28

相關推薦

  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Python range: 強大的迭代器函數

    Python range函數是Python中最常用的內置函數之一。它被廣泛用於for循環的迭代,列表推導式,和其他需要生成一系列數字的應用程序中。在本文中,我們將會詳細介紹Pyth…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • 如何使用Python執行Shell命令並獲取執行過程信息

    本文將介紹如何使用Python執行Shell命令並獲取執行過程信息。我們將從以下幾個方面進行闡述: 一、執行Shell命令 Python內置的subprocess模塊可以方便地執行…

    編程 2025-04-28
  • Python調用C代碼過程用法介紹

    本文將從多個方面詳細闡述Python調用C代碼的過程,包括相關的知識點、實例代碼以及注意事項等內容。 一、概述 Python作為一門高級語言,在很多情況下不能滿足開發人員的需求。此…

    編程 2025-04-27
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • Python自動搶購代碼實現過程

    本文將詳細介紹使用Python實現自動搶購的代碼實現過程。 一、安裝selenium庫 Selenium是一個自動化測試框架,可以在瀏覽器中模擬用戶操作,可以用來實現自動搶購。 首…

    編程 2025-04-27

發表回復

登錄後才能評論