我很难理解PHP的iterator_to_array
功能。
我尝试阅读手册,但没有帮助。
这是什么?我怎么用呢?适当的用例是什么?
答案 0 :(得分:6)
简而言之,iterator_to_array()
函数接受类型Traversable
的迭代器,并将其转换为关联/非关联数组,具体取决于提供的参数。来自the documentation,
array iterator_to_array ( Traversable $iterator [, bool $use_keys = true ] )
该函数采用以下两个参数,
第一个参数是Traversal
类型,它是一个接口。 IteratorAggregate
和Iterator
类都扩展了此接口。您可以在自定义类中实现这两个类,如下所示:
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。