<?php
//迭代器设计模式可帮助构造特定对象,那些对象能够提供单一标准接口循环或迭代任何类型的可计数数据。
class CD{
public $band = '';
public $title = '';
public $trackList = [];
public function __construct($band, $title){
$this->band = $band;
$this->title = $title;
}
public function addTrack($track){
$this->trackList = $track;
}
}
class CDSearchByBandIterator implements Iterator{
private $_CDs = [];
private $_valid = false;
public function __construct($bandName){
$result = [
['band' => 'fenghuangchuanqi', 'title' => 'chuanqi', 'tracktitle' => ['yueliangzhishang', 'hetangyuese']],
['band' => 'fenghuangchuanqi', 'title' => 'fenghuang', 'tracktitle'=> ['zuixuanminzufeng']],
['band' => 'tfboys', 'title' => 'ai', 'tracktitle'=> ['zuoshouyoushou']],
];
foreach($result as $v){
if($v['band'] == $bandName){
$cd = new CD($v['band'], $v['title']);
$cd->addTrack($v['tracktitle']);
$this->_CDs[] = $cd;
}
}
}
public function next(){
$this->_valid = (next($this->_CDs) === false)?false:true;
}
public function rewind(){
$this->_valid = (reset($this->_CDs) === false)?false:true;
}
public function valid(){
return $this->_valid;
}
public function current(){
return current($this->_CDs);
}
public function key(){
return key($this->_CDs);
}
}
$queryItem = 'fenghuangchuanqi';
$cds = new CDSearchByBandIterator($queryItem);
echo 'Found the Following CDs'.PHP_EOL;
foreach($cds as $cd){
echo 'Band:'.$cd->band.PHP_EOL;
echo 'Title:'.$cd->title.PHP_EOL;
echo 'Num Tracks:'.count($cd->trackList).PHP_EOL;
foreach($cd->trackList as $track){
echo 'TrackTitle:'.$track.PHP_EOL;
}
echo PHP_EOL;
}