php - 从具有额外参数的扩展 RecursiveIterator 循环 RecursiveIteratorIterator

标签 php iterator spl

假设我有以下 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 而不提供额外参数,则不会发生这种情况。

最佳答案

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

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

    return (parent::hasChildren()) || (parent::current() == $this->value);
    
  2. $this->current () 还将字符串切换为数组,您可以根据您想要实现的目标执行此操作来管理两者

    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);
} 

:)

关于php - 从具有额外参数的扩展 RecursiveIterator 循环 RecursiveIteratorIterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9197726/

相关文章:

javascript - 自动完成 div 不会消失 [PHP/JQuery]

php - Laravel 从关系中获取第一项的模型

java - 从一个列表复制到另一个

PHP SPL,值得使用还是原始数组函数更好?

php - 代码处理时间太长,内存占用大

php - 如何使用 spl_autoload 自动在所有命名空间中使用根类?

php - Laravel 4 从 URL 中删除 Index.php

php - 如何在所有 Blade View 中获取全局用户配置文件数据?

c++ - 你可以 pop_back 一个 vector 并仍然使用迭代器到最后一个元素吗?

C++ 遍历某个子类的列表