【发布时间】:2012-02-25 02:07:39
【问题描述】:
在 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 中的递归迭代器有些不理解,但它的文档在这方面真的很糟糕。
非常感谢。
【问题讨论】:
-
“它的文档真的很糟糕”——欢迎任何关于这个话题的反馈,给我发电子邮件(我在 SO 上的用户名,@php.net)。