最近BI項目重新改造,原有資料是通過PHP迴圈分析資料,更改後,想使用迭代器。這裡我將PHP的迭代器總結下
迭代器有時又稱游標(cursor)是程式設計的軟體設計模式,可在容器物件(container,例如list或vector)上遍訪的介面,設計人員無需關心容器物件的內容。就好比SQL中的遊標原理一樣,遍曆訪問。
PHP語言與其它語言不同,如Java、python等語言就將Iterator完美的整合,我們稱隱式迭代器(implicit iterator)。PHP5菜開始支援介面,所以在這個時候才內建了Iterator介面。所以在PHP總,你定義了一個類,並實現了Iterator介面,那麼你的這個類對象就是ZEND_ITER_OBJECT,否則就是ZEND_ITER_PLAIN_OBJECT。
對於ZEND_ITER_PLAIN_OBJECT的類,foreach會通過HASH_OF擷取該對象的預設屬性數組,然後對該數組進行foreach。
而對於ZEND_ITER_OBJECT的類對象,則會通過調用對象實現的Iterator介面相關函數來進行foreach。
看下面的例子,我們實際的代碼來說明:
<?php/*** Iterator模式的簡單實現*/class mysample impplements Iterator { private $_items; public function __construct(&$data) { // 使用引用 $this->_items = $data; } // 擷取指向現在的 public function current() { return current($this->_items); } // 指向下一個 public function next() { next($this->_items); } // 擷取當前指向的KEY public function key() { return key($this->_items); } // 重設 public function rewind() { reset($this->_items); } // 是否有效資料,當前是否存在合法 public function valid() { return ($this->_current() != FALSE); }}// 測試$data = array(1, 2, 3, 4, 5);$sa = new mysample($data);foreach ($sa as $k => $v) { echo $key, ' ', $v, '<br />';}?>
不同的迭代器有不同的介面,在PHP中:Next()(移動到下一個元素),corrent()(返回當前元素),valid()(檢查迭代結尾),rewind()(從頭重新開始),key()(返回當前元素的索引)。當然你可以自己寫適合自己用的迭代器,也可以用系統中的迭代器。
在PHP中while迴圈是最常使用
<?php // 如上面的 while ($iterator->valid()) { $element=$iterator->current(); // 擷取當前元素 $iterator->next(); }?> 上面的代碼是不是非常簡潔方便呢。
使用迭代器來分析資料非常重要,這裡有兩個主要原因
1、利用PHP的迭代器可以利用物件導向實現常見的資料結構,例如:列表、棧堆、隊列等。可以實現大部分資料結構
2、使用方便,靈活;防止死迴圈等不符合邏輯的點。