PHP 迭代器转换为数组 iterator_to_array
一般情况下,PHP 中的迭代器和生成器都是配合 foreach 语句使用的。
但有些情况下,我们不得不将一个迭代器或生成器转换为数组,也就是一次性获取迭代器或生成器的所有值。
这种要求,我们要如何实现呢 ?
最容易想到的方式,就是使用 foreach
语句遍历一遍,将值赋值给一个数组,代码类似于
<?php function count_to_ten() { foreach (range(0,10) as $v) { yield $v; } } $nums = array(); foreach (count_to_ten() as $num) { $nums[] = $num; } print_r($nums);
运行结果为
[yufei@www.twle.cn helloworld]$ php demo.php Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 )
因为这种需求是如此的常见,所以 PHP 也按照上面的思维实现了一个 iterator_to_array()
函数,但功能远远比我们写的强大太多了。
PHP iterator_to_array() 函数
PHP 在 5.1.0 中就引入了 iterator_to_array()
函数,用于将一个迭代器或生成器转换为一个数组。
该函数的原型如下
array iterator_to_array ( Traversable $iterator [, bool $use_keys = true ] )
参数 | 说明 |
---|---|
iterator | 要转换的迭代器或生成器 |
use_keys | 是否使用迭代器或生成器自己的键作为索引,默认为 true 。PHP 5.2.1 中新增 |
范例一
将一个关联数组迭代器转换为数组
-
保持迭代器原来的键
$iterator = new ArrayIterator(array('recipe'=>'pancakes', 'egg', 'milk', 'flour')); var_dump(iterator_to_array($iterator, true));
输出结果为
array(4) { ["recipe"]=> string(8) "pancakes" [0]=> string(3) "egg" [1]=> string(4) "milk" [2]=> string(5) "flour" }
-
不使用迭代器的键,而是保存为一个数组
$iterator = new ArrayIterator(array('recipe'=>'pancakes', 'egg', 'milk', 'flour')); var_dump(iterator_to_array($iterator, false));
输出结果为
array(4) { [0]=> string(8) "pancakes" [1]=> string(3) "egg" [2]=> string(4) "milk" [3]=> string(5) "flour" }
范例二: iterator_to_array() 函数同样也可以用于生成器
iterator_to_array() 函数同样也可以用于生成器,可以将一个生成器转换为数组
<?php function count_to_ten() { foreach (range(0,10) as $v) { yield $v; } } $nums = iterator_to_array(count_to_ten()); print_r($nums);
输出结果为
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 )