假设我有以下 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
而不提供额外参数,则不会发生这种情况。
最佳答案
我决定自己运行脚本,这就是我注意到的
您正在使用多数组,因此
parent::current()
可以是一个数组,这意味着 下面的行是错误的,因为$this->value
是一个整数。return (parent::hasChildren()) || (parent::current() == $this->value);
$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 ()); }
您还需要实现
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/