本文目錄一覽:
- 1、在PHP中遍歷對象用什麼?
- 2、php迭代器iterator怎麼用
- 3、迭代器是什麼
- 4、php:我是Php新手下面這個數組排序看不大懂,求高手指點啊
- 5、誰能幫我講解一下這段php PDO的代碼
在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-hant/n/259365.html