用于获取二维数组的递归迭代器的iterator_to_array类型

Wai*_*... 5 php oop spl iterator

当在PHP中使用迭代器时,你可以使用iterator_to_array函数来提取迭代产生的数组.例如,假设您有以下内容ArrayObject:

$array_object = new ArrayObject(array(
   array('1', '2', '3', '4'),
   array('5', '6', '7', '8'),
   array('9', '10', '11', '12'),
));
Run Code Online (Sandbox Code Playgroud)

如您所见,它的存储是一个二维数组.

我们可以创建一个FilterOperator只接受它的第一个项目(我知道它会更好LimitIterator,它只是作为一个示例目的):

class myFilterIterator extends FilterIterator
{
   public function accept()
   {
      return ($this->key() === 0);
   }
}

$filter_iterator = new myFilterIterator(new ArrayIterator($array_object));
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做:

print_r(iterator_to_array($filter_iterator));
Run Code Online (Sandbox Code Playgroud)

如果我手动循环运算符,我得到的数组:

Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) )
Run Code Online (Sandbox Code Playgroud)

但是现在如果我想和一个人一起工作RecursiveFilterIterator呢?比方说我有:

class myRecursiveFilterIterator extends RecursiveFilterIterator
{
   public function accept()
   {
      return ($this->hasChildren() || $this->key() === 0);
   }
}

$recursive_filter_iterator = new myRecursiveFilterIterator(new RecursiveArrayIterator($array_object));
Run Code Online (Sandbox Code Playgroud)

如您所见,这将只接受父数组中包含的每个数组的键0.因此,如果我递归迭代它,它就可以工作:

foreach (new RecursiveIteratorIterator($recursive_filter_iterator) as $value) {
   print_r($value);
   echo '<br />';
}
Run Code Online (Sandbox Code Playgroud)

结果是:

1
5
9
Run Code Online (Sandbox Code Playgroud)

但是,我怎么能快速得到阵列array(array(1), array(5), array(9))

如果我做:

print_r(iterator_to_array($recursive_filter_iterator));
Run Code Online (Sandbox Code Playgroud)

要么

print_r(iterator_to_array($recursive_filter_iterator->getInnerIterator()));
Run Code Online (Sandbox Code Playgroud)

要么

$it = new RecursiveIteratorIterator($recursive_filter_iterator);
print_r(iterator_to_array($it->getInnerIterator()));
Run Code Online (Sandbox Code Playgroud)

我得到了整个原始数组:

Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) [1] => Array ( [0] => 5 [1] => 6 [2] => 7 [3] => 8 ) [2] => Array ( [0] => 9 [1] => 10 [2] => 11 [3] => 12 ) )
Run Code Online (Sandbox Code Playgroud)

如果我做:

print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator)));
Run Code Online (Sandbox Code Playgroud)

我得到第一项:

Array ( [0] => 9 )
Run Code Online (Sandbox Code Playgroud)

如果我做:

print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator->getInnerIterator())));
Run Code Online (Sandbox Code Playgroud)

我在父数组中得到最后一项,但是键0:

Array ( [0] => 9 [1] => 10 [2] => 11 [3] => 12 ) 
Run Code Online (Sandbox Code Playgroud)

我需要的是获得数组:

Array ( [0] => Array ( [0] => 1 ) [1] => Array ( [0] => 5 ) [2] => Array ( [0] => 9 ) ) 
Run Code Online (Sandbox Code Playgroud)

我知道我可以手动循环,但我想知道是否有直接的方式,比如iterator_to_array不是递归迭代器.当然有一些我不了解PHP中的递归迭代器,但它的文档在这方面非常糟糕.

非常感谢你.

sal*_*the 3

目前尚不完全清楚您真正想要做什么,但以下内容采用 a RecursiveArrayIterator(注意:ArrayObject不是递归迭代器)并用于获取iterator_to_array()您想要的结果数组。

class FirstOnlyRecursiveArrayIterator extends ParentIterator {
    public function __construct(RecursiveArrayIterator $it) {
         parent::__construct($it);
    }
    public function current() {
        $children = parent::current();
        return array_slice($children, 0, 1);
    }
}

$array_it = new RecursiveArrayIterator(array(
    array('1', '2', '3', '4'),
    array('5', '6', '7', '8'),
    array('9', '10', '11', '12'),
));

$filter_iterator = new RecursiveIteratorIterator(
    new FirstOnlyRecursiveArrayIterator($array_it),
    RecursiveIteratorIterator::SELF_FIRST);
print_r(iterator_to_array($filter_iterator));
Run Code Online (Sandbox Code Playgroud)