在迭代器中排除项目

时间:2011-04-08 10:18:49

标签: php iteration

我在PHP的Iterator界面中搜索最佳实践。

想象一下,我有一个包含不同项目的菜单。对于每个项目,我可以打开或关闭visibilty。你知道放置这个过滤器的好地方吗?我考虑过Iterator::rewind()方法做一个单独的循环,但不喜欢第二次循环遍历项目的事实。

我想我看到树木了。希望你能帮忙。

3 个答案:

答案 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]);
    }
}