Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 一种迭代器到数组,用于递归迭代器获取二维数组_Php_Oop_Iterator_Spl - Fatal编程技术网

Php 一种迭代器到数组,用于递归迭代器获取二维数组

Php 一种迭代器到数组,用于递归迭代器获取二维数组,php,oop,iterator,spl,Php,Oop,Iterator,Spl,在PHP中使用迭代器时,可以使用iterator\u to\u array函数来提取迭代产生的数组。例如,假设您有以下ArrayObject: $array_object = new ArrayObject(array( array('1', '2', '3', '4'), array('5', '6', '7', '8'), array('9', '10', '11', '12'), )); 如您所见,它的存储是一个二维数组 我们可以将FilterOperator限定为只接

在PHP中使用迭代器时,可以使用
iterator\u to\u array
函数来提取迭代产生的数组。例如,假设您有以下
ArrayObject

$array_object = new ArrayObject(array(
   array('1', '2', '3', '4'),
   array('5', '6', '7', '8'),
   array('9', '10', '11', '12'),
));
如您所见,它的存储是一个二维数组

我们可以将
FilterOperator
限定为只接受其第一项(我知道使用
LimitIterator
会更好,这只是一个示例目的):

现在,如果我这样做:

print_r(iterator_to_array($filter_iterator));
如果我手动循环通过操作符,我可以得到数组:

Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) )
但是现在如果我想使用一个
递归过滤器操作符
,该怎么办呢?假设我有:

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

如果我这样做:

print_r(iterator_to_array($recursive_filter_iterator));
print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator)));
print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator->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($recursive_filter_iterator));
print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator)));
print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator->getInnerIterator())));
我只得到第一项:

Array ( [0] => 9 )
如果我这样做:

print_r(iterator_to_array($recursive_filter_iterator));
print_r(iterator_to_array(new RecursiveIteratorIterator($recursive_filter_iterator)));
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 ) ) 
我知道我可以让它手动循环,但我想知道是否有一种直接的方法,比如对于非递归迭代器,在
迭代器\u to\u数组中。当然,我对PHP中的递归迭代器有些不了解,但它的文档在这方面非常糟糕


非常感谢。

您需要/想要使用迭代器吗?可以使用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);
?>

如果我误解了你的问题,我道歉。

好的。一个简单的方法可能是如下。它扩展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));
?>

还不完全清楚您真正想要做什么,但是下面使用一个
递归ArrayIterator
(注意:
ArrayObject
不是递归迭代器)并使用
迭代器\u to \u 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));

是的,我想用迭代器来实现这一点:)谢谢你,@csolahey,是的,我知道有很简单的方法来实现我想要的,但我想用递归迭代器来实现。无论如何,谢谢你。“它的文档非常糟糕”-欢迎对此主题的任何反馈,给我发一封电子邮件(我在SO上的用户名@php.net)。好的,谢谢@salathe。这确实有效。但我觉得这很奇怪,至少我不太明白。PHP文档说,
parent迭代器
filteritator
扩展的,只显示有子元素的元素。因此,我认为它的
accept()
方法只能确定当前元素是否有子元素。必须覆盖过滤的
current()
方法,而不是
accept()
我认为这不是很干净。此外,我的示例应该有效,因为我也在检查current是否有子项,但它没有。