排序迭代器
迭代器不僅可以顯示全部或部分集合。而且,還可以按特定順序顯示集合。下面,創(chuàng)建一個按集合眾介質(zhì)的發(fā)布日期進行排序的迭代器。為了進行測試,請?zhí)砑幽承┤掌谠?setUp() 方法中添加的項之后的介質(zhì)實例。如果迭代器運行,則這些日期較后的項應(yīng)該位于迭代操作的最前面。
class IteratorTestCase extends UnitTestCase { // ... function TestReleasedIteratorUsage() { $this->lib->add(new Media(‘second’, 1999)); $this->lib->add(new Media(‘first’, 1989)); $this->assertIsA( $it = $this->lib->getIterator(‘released’) ,’LibraryReleasedIterator’); $output = array(); while ($item = $it->next()) { $output[] = $item->name .’-’. $item->year; } $this->assertEqual( ‘first-1989 second-1999 name1-2000 name3-2001 name2-2002’ ,implode(‘ ‘,$output)); } }
該測試使用的項在每個迭代中略有不同:并不僅僅是在字符串值后添加 $name,而是,字符串同時具有 $name 和 $year 屬性,這些屬性隨后將被添加到 $output 數(shù)組。LibraryReleasedIterator 的實現(xiàn)與 LibraryIterator 非常類似,除了 constuctor 中的一行語句:
class LibraryReleasedIterator extends LibraryIterator { function __construct($collection) { usort($collection, create_function(‘$a,$b’,’ return ($a->year - $b->year);’)); $this->collection = $collection; } }
用粗體表示的這一行將 $collection 數(shù)組排在迭代之前。你可以通過簡單地繼承 LibraryIterator 類,來避免復(fù)制該類的其它所有代碼?梢允褂猛獠康鱽韺崿F(xiàn)相同的排序迭代嗎?是的,但是你必須注意完成它的訣竅。
class LibraryReleasedExternalIterator { protected $collection; protected $sorted_keys; protected $key=-1; function __construct($collection) { $this->collection = $collection; $sort_funct = create_function( ‘$a,$b,$c=false’, ‘static $collection; if ($c) { $collection = $c; return; } return ($collection->get($a)->year - $collection->get($b)->year);’); $sort_funct(null,null,$this->collection); $this->sorted_keys = $this->collection->keys(); usort($this->sorted_keys, $sort_funct); } function next() { if (++$this->key >= $this->collection->count()) { return false; } else { return $this->collection->get($this->sorted_keys[$this->key]); } } }
其中,關(guān)鍵是創(chuàng)建用于排序的實用程序函數(shù)。排序函數(shù)必須能夠訪問集合,以便可以獲取對照成員。然而,因為 gener- ated 函數(shù)在 usort() 中使用,沒有將集合作為其它參數(shù)傳遞的選項。相反,你可以利用上述代碼塊中顯示的訣竅,在利用 usort() 調(diào)用函數(shù)之前,將引用存儲在函數(shù)中內(nèi)部的集合中。排序的項是集合的關(guān)鍵字列表。當 usort() 完成時,關(guān)鍵字會按照集合中每個對象的 year 屬性的順序進行排序。在 next() 方法中,可以通過 get() 方法訪問集合中的對象,而不是間接通過 $sorted_keys 映射。如果重新調(diào)用外部版本的 GoF 風格的迭代器,則不連續(xù)的數(shù)組或關(guān)鍵字中的字符串可能會有問題。可以使用針對 sim- ple 外部迭代器的相同訣竅,來減少關(guān)鍵字順序不連貫的問題。
出處:phpchina
責任編輯:bluehearts
上一頁 php設(shè)計模式介紹之迭代器模式 [5] 下一頁 php設(shè)計模式介紹之迭代器模式 [7]
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|