gpt4 book ai didi

php - 一种用于递归迭代器的 iterator_to_array 以获得二维数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:42:21 24 4
gpt4 key购买 nike

在 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'),
));

如你所见,它的存储是一个二维数组。

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

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

$filter_iterator = new myFilterIterator(new ArrayIterator($array_object));

现在,如果我这样做:

print_r(iterator_to_array($filter_iterator));

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

Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) )

但是现在如果我想使用 RecursiveFilterIterator 怎么办?假设我有:

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

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

如您所见,对于父数组中包含的每个数组,这将只接受键 0。因此,如果我递归迭代它,它就会起作用:

foreach (new RecursiveIteratorIterator($recursive_filter_iterator) as $value) {
print_r($value);
echo '<br />';
}

结果:

1
5
9

但是,我怎样才能快速得到数组 array(array(1), array(5), array(9))

如果我这样做:

print_r(iterator_to_array($recursive_filter_iterator));

print_r(iterator_to_array($recursive_filter_iterator->getInnerIterator()));

$it = new RecursiveIteratorIterator($recursive_filter_iterator);
print_r(iterator_to_array($it->getInnerIterator()));

我得到整个原始数组:

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

如果我这样做:

print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator)));

我只得到第一个项目:

Array ( [0] => 9 )

如果我这样做:

print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator->getInnerIterator())));

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

Array ( [0] => 9 [1] => 10 [2] => 11 [3] => 12 ) 

我需要的是获取数组:

Array ( [0] => Array ( [0] => 1 ) [1] => Array ( [0] => 5 ) [2] => Array ( [0] => 9 ) ) 

我知道我可以让它手动循环,但我想知道是否有直接的方法,比如在 iterator_to_array 中用于非递归迭代器。当然,我对 PHP 中的递归迭代器有一些不了解的地方,但它的文档在这方面确实很糟糕。

非常感谢。

最佳答案

还不完全清楚你真正想做什么,但下面采用了一个 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));

关于php - 一种用于递归迭代器的 iterator_to_array 以获得二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9112010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com