在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中的递归迭代器的东西,但它的文档非常糟糕。
非常感谢。
答案 0 :(得分:3)
目前还不完全清楚你真正想做什么,但以下内容需要RecursiveArrayIterator
(注意:ArrayObject
不是递归迭代器)并使用{ {1}}获取所需的结果数组。
iterator_to_array()
答案 1 :(得分:0)
您是否需要/想要使用迭代器?你可以使用php的内置array_map()函数,它接受一个数组和一个函数,并将指定的函数应用于数组中的每个元素。所以你可以这样做:
<?php
function get_first($foo)
{
return array_slice($foo, 0, 1); //slice the array right after the first element
}
$array_object = new ArrayObject(array(
array('1', '2', '3', '4'),
array('5', '6', '7', '8'),
array('9', '10', '11', '12'),
));
$new_array = array_map("get_first", $array_object->getArrayCopy());
print_r($new_array);
?>
结果将是:
Array
(
[0] => Array
(
[0] => 1
)
[1] => Array
(
[0] => 5
)
[2] => Array
(
[0] => 9
)
)
如果我误解了你的问题,我道歉。
答案 2 :(得分:0)
行。一个简单的方法可能是以下。它扩展了ArrayIterator类并重写了current()函数以返回切片数组:
<?php
class FirstOnlyIterator extends ArrayIterator
{
public function current()
{
$next = parent::current();
return array_slice($next, 0, 1);
}
}
$array_object = new ArrayObject(array(
array('1', '2', '3', '4'),
array('5', '6', '7', '8'),
array('9', '10', '11', '12'),
));
$iterator = new FirstOnlyIterator($array_object);
print_r(iterator_to_array($iterator));
?>