我在PHP的Iterator界面中搜索最佳实践。
想象一下,我有一个包含不同项目的菜单。对于每个项目,我可以打开或关闭visibilty。你知道放置这个过滤器的好地方吗?我考虑过Iterator::rewind()方法做一个单独的循环,但不喜欢第二次循环遍历项目的事实。
我想我看到树木了。希望你能帮忙。
答案 0 :(得分:2)
呃,你不能只使用continue
吗?
$exclude=array(0,2,3,5);
$data=array('Item1','Item2','Item3','Item4','Item5','Item6');
foreach($data as $id=>$value){
if(in_array($id,$exclude))continue;
echo $value.' ';
}
考虑到您有可见性属性,您可以执行if(!visible)continue;
答案 1 :(得分:1)
看看abstrakt FilterIterator课程。看起来像
class MyFilterIterator extends FilterIterator {
public function accept () {
$current = $this->current();
// Test, if it is valid
return $boolean;
}
}
$iterator = new MyFilterIterator($myInnerIterator);
通过这种方式,您还可以将菜单与过滤器分开,如果您想要更改过滤器,可以更轻松地更换过滤器。
答案 2 :(得分:0)
此迭代器实现将仅扫描可见项。 您可以调整类以对参数化过滤器进行参数化。
class myItem implements Iterator {
private $position = -1;
public function __construct() {
$this->position = -1; // mean unknown position
}
function rewind() {
$this->position = -1;
$this->next();
}
function current() {
return $this->array[$this->position];
}
function key() {
return $this->position;
}
function next() {
$p = $this->position+1;
// skip invisible items
while ( isset($this->array[$p]) && (!$this->array[$p]->visible)) $p++;
$this->position = $p;
}
function valid() {
return isset($this->array[$this->position]);
}
}