關於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){ |
樣本2 顯示/etc/目錄下的嵌套的任意層的子目錄中的所有檔案(顯示出目錄路徑):
查看原始碼
列印協助
1 |
$path = new RecursiveDirectoryIterator(“/etc/”); |
2 |
foreach ($path as $file){ |
3 |
echo $file->getPathname().’/n’; |
樣本3 顯示/etc/目錄下的前10個檔案:
查看原始碼
列印協助
1 |
$path = new LimitIterator(DirectoryIterator(“/etc/”),0,10); |
2 |
foreach ($path as $file){ |
從這幾個樣本可以看出利用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;
}