【问题标题】:Loop a RecursiveIteratorIterator from an extended RecursiveIterator with extra arguments从带有额外参数的扩展 RecursiveIterator 循环 RecursiveIteratorIterator
【发布时间】:2012-02-08 16:47:31
【问题描述】:

假设我有关注ArrayObject:

$array_object = new ArrayObject(array(
   array('1', '2', '3', '4'),
   array('3', '6', '7', '8'),
   array('9', '3', '11', '12'),
));

我扩展 RecursiveFilterIterator 以仅接受值等于参数中传递的某个值的子元素:

class myRecursiveFilterIterator extends RecursiveFilterIterator
{
   public $value;

   public function __construct($it, $value)
   {
      parent::__construct($it);
      $this->value = $value;
   }

   public function accept()
   {
      return (parent::hasChildren()) || (parent::current() == $this->value);
   }
}

我创建了这个全新迭代器的一个实例,以过滤等于 3 的值:

$recursive_filter_iterator = new myRecursiveFilterIterator(new RecursiveArrayIterator($array_object), 3);

如果现在我使用RecursiveIteratorIterator 循环整个myRecursiveFilterIterator

foreach (new RecursiveIteratorIterator($recursive_filter_iterator) as $value) {
   var_dump($value);
}

我收到以下警告:

Warning: Missing argument 2 for myRecursiveFilterIterator::__construct() in /my/path/test.php on line myLine Notice: Undefined variable: value in /my/path/test.php on line myOtherLine

所以就像循环 RecursiveIteratorIterator 试图实例化 myRecursiveFilterIterator 而不传递第二个参数 $value

如果我在不提供额外参数的情况下扩展 FilterIterator,则不会发生这种情况。

【问题讨论】:

    标签: php iterator spl


    【解决方案1】:

    我决定自己运行脚本,这就是注意到的

    1. 您正在使用多数组,因此 parent::current() 可以是一个数组,这意味着 下面的行是错误的,因为$this->value 是一个整数。

      return (parent::hasChildren()) || (parent::current() == $this->value);
      
    2. $this->current () 还可以将 String 切换为 Array,您可以这样做来管理两者,具体取决于您想要实现的目标

      if (is_array ( $current )) {
          return ($this->hasChildren ()) || (in_array ( ( string ) $this->value, $this->current () ));
      } else {
      
          //var_dump ( $this->value, $this->current () );
      
          return ($this->hasChildren ()) || ( $this->value == $this->current ());
      }
      
    3. 您还需要实现 getChildren 方法,这就是 PHP 抱怨 myRecursiveFilterIterator::__construct() 缺少参数 2 的原因

      public function getChildren() {
          return new self ( $this->getInnerIterator ()->getChildren (), $this->value );
      }
      

    =============================== 丢弃旧响应============== ===============

    PHP 大部分都传达了错误的错误消息 .. 您的代码很好,但是当您尝试直接将 foreach 与 RecursiveIteratorIterator 一起使用时,错误就出现了

    这里有一个更好的方法,使用 RecursiveArrayIterator 来封装 RecursiveIteratorIterator :

    foreach (new RecursiveArrayIterator(new RecursiveIteratorIterator($recursive_filter_iterator)) as $value) {
        var_dump($value);
    } 
    

    :)

    【讨论】:

    • 感谢您的回答,@Baba,但这不起作用。警告消失了,但没有任何内容被循环($value 没有被 var_dumped,也没有任何东西被尝试过)
    • 我没有给你其他选择,而是决定真正找到你错误的原因......查看更新的答案
    • 太棒了@Baba!!!这样可行!所以诀窍在于getChildren() 方法... :) 非常感谢。
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多