PHP中的iterator_to_array函数是什么?

时间:2016-10-01 10:15:32

标签: php

我很难理解PHP的iterator_to_array功能。

我尝试阅读手册,但没有帮助。

这是什么?我怎么用呢?适当的用例是什么?

2 个答案:

答案 0 :(得分:6)

简而言之,iterator_to_array()函数接受类型Traversable的迭代器,并将其转换为关联/非关联数组,具体取决于提供的参数。来自the documentation

array iterator_to_array ( Traversable $iterator [, bool $use_keys = true ] )

该函数采用以下两个参数,

  • 第一个参数是Traversal类型,它是一个接口。 IteratorAggregateIterator类都扩展了此接口。您可以在自定义类中实现这两个类,如下所示:

    class myIterator implements IteratorAggregate {
        private $array = array('key1'=>'value1', 'value2', 'value3', 'value4');
    
        public function getIterator(){
            return new ArrayIterator($this->array);
        }
    }
    
    $obj = new myIterator;
    $array = iterator_to_array($obj->getIterator(), true);
    var_dump($array);
    

    或者,

    class myIterator implements Iterator {
        private $key;
        private $array = array('key1'=>'value1', 'value2', 'value3', 'value4');
    
        public function __construct(){
            $this->key = key($this->array);
        }
    
        public function rewind(){
            reset($this->array);
            $this->key = key($this->array);
        }
    
        public function current(){
            return $this->array[$this->key];
        }
    
        public function key(){
            return $this->key;
        }
    
        public function next(){
            next($this->array);
            $this->key = key($this->array);
        }
    
        public function valid(){
            return isset($this->array[$this->key]);
        }
    }
    
    $obj = new myIterator;
    $array = iterator_to_array($obj, true);
    var_dump($array);
    

    这里要注意的最重要的一点是传递给iterator_to_array()函数的参数1必须实现接口Traversable,所以你不能直接传递任何其他的数组或对象键入此功能。请参阅以下示例

    $array = array('key1'=>'value1', 'value2', 'value3', 'value4');
    $array = iterator_to_array($array, true);  // wrong
    
  • 第二个参数是一个布尔值,用于指示是否使用迭代器元素键作为索引。请参阅Example #1 here

答案 1 :(得分:2)

迭代器很有用,因为它们允许您在foreach循环中使用自定义定义的数据顺序。让我们从the PHP manual

中获取这个(略微减少的)示例
class myIterator implements Iterator {
    private $position = 0;
    private $array = array(
        "firstelement",
        "secondelement",
        "lastelement",
    );

    public function __construct() {
        $this->position = 0;
    }

    function rewind() {
        $this->position = 0;
    }

    function current() {
        return $this->array[$this->position];
    }

    function key() {
        return $this->position;
    }

    function next() {
        ++$this->position;
    }

    function valid() {
        return isset($this->array[$this->position]);
    }
}

$it = new myIterator;

要迭代它,我们可以像数组一样使用foreach循环:

foreach($it as $ele){
    echo $ele;
}

数组不同,您不能先访问单个元素而不先迭代它。试图这样做会给你一个致命的错误:

/*
 * Fatal error: Uncaught Error: Cannot use object of type myIterator as array
 * in /home/hpierce/sandbox.php
 */
echo $it[1];

//Iterating to the second element.
$it->next();

// "secondelement"
echo $it->current();

要访问单个元素,可以使用iterator_to_array()将迭代器强制转换为数组,然后在没有额外步骤的情况下访问该元素:

$array = iterator_to_array($it);

// "secondelement"
echo $array[1];

如果您提前知道需要访问迭代器中的单个元素,则应考虑使用ArrayIterator