iterator_to_array

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

iterator_to_array将迭代器复制到数组中

说明

iterator_to_array(Traversable|array $iterator, bool $preserve_keys = true): array

将迭代器的元素复制到数组中。

参数

iterator

要复制的迭代器。

preserve_keys

是否使用迭代器元素键作为索引。

如果键是 arrayobject,将生成警告。null 键将转换为空字符串,float 键将截断为其 int 对应物,resource 键将生成警告并转换为其资源 ID,bool 键将转换为整数。

注意:

如果此参数未设置或设置为 true,则重复键将被覆盖。具有给定键的最后一个值将出现在返回的 array 中。将此参数设置为 false 以在任何情况下都获取所有值。

返回值

包含 iterator 元素的 array

变更日志

版本 说明
8.2.0 iterator 的类型已从 Traversable 扩展到 Traversable|array

示例

示例 #1 iterator_to_array() 示例

<?php
$iterator
= new ArrayIterator(array('recipe'=>'pancakes', 'egg', 'milk', 'flour'));
var_dump(iterator_to_array($iterator, true));
var_dump(iterator_to_array($iterator, false));
?>

上面的示例将输出

array(4) {
  ["recipe"]=>
  string(8) "pancakes"
  [0]=>
  string(3) "egg"
  [1]=>
  string(4) "milk"
  [2]=>
  string(5) "flour"
}
array(4) {
  [0]=>
  string(8) "pancakes"
  [1]=>
  string(3) "egg"
  [2]=>
  string(4) "milk"
  [3]=>
  string(5) "flour"
}

添加笔记

用户贡献笔记 6 笔记

8
wizzard351 at yahoo dot com
2 年前
要记住的一件重要事情是,迭代器可以是无限的。并非所有迭代器都必须结束。如果在这样的迭代器上使用 iterator_to_array,它将耗尽可用内存,并抛出致命错误。

例如,考虑以下代码

<?php

function fibonacci(): Generator
{
yield
$a = 1;
yield
$b = 2;

start:
yield
$c = $a + $b;
$a = $b;
$b = $c;
goto
start;
}

$fibonacciSequence = fibonacci();
iterator_to_array($fibonacciSequence);

?>

由于 <?php fibonacci(); ?> 生成一个无限的斐波那契数列,这是有效的,因为它实际上是一个无限数列,那么尝试将其转换为数组将失败。
6
jerome at yazo dot net
15 年前
使用布尔参数

<?php

$first
= new ArrayIterator( array('k1' => 'a' , 'k2' => 'b', 'k3' => 'c', 'k4' => 'd') );
$second = new ArrayIterator( array( 'k1' => 'X', 'k2' => 'Y', 'Z' ) );

$combinedIterator= new AppendIterator();
$combinedIterator->append( $first );
$combinedIterator->append( $second );

var_dump( iterator_to_array($combinedIterator, false) );

?>

将输出

array(7) (
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(1) "c"
[3]=>
string(1) "d"
[4]=>
string(1) "X"
[5]=>
string(1) "Y"
[6]=>
string(1) "Z"
)

<?php

var_dump
( iterator_to_array($combinedIterator, true) );

?>

将输出(因为键会合并)

array(5) (
["k1"]=>
string(1) "X"
["k2"]=>
string(1) "Y"
["k3"]=>
string(1) "c"
["k4"]=>
string(1) "d"
[0]=>
string(1) "Z"
)
5
joksnet at gmail dot com
9 年前
要从嵌套迭代器生成一个深度数组

<?php
function iterator_to_array_deep(\Traversable $iterator, $use_keys = true) {
$array = array();
foreach (
$iterator as $key => $value) {
if (
$value instanceof \Iterator) {
$value = iterator_to_array_deep($value, $use_keys);
}
if (
$use_keys) {
$array[$key] = $value;
} else {
$array[] = $value;
}
}
return
$array;
}
?>

我用它来测试迭代器:https://gist.github.com/jm42/cb328106f393eeb28751
3
Harry Willis
9 年前
在 SplObjectStorage 对象上使用 iterator_to_array() 时,建议将 $use_keys 设置为 false。

生成的数组是相同的,因为 SplObjectStorage::key() 生成的迭代器键始终是 0 到 (COUNT-1) 的整数。传递 $use_keys=false 会减少对 SplObjectStorage::key() 的不必要调用,从而带来轻微的性能优势。
-6
chad 0x40 herballure 0x2e com
16 年前
在 5.2.x 版本之一中添加了 use_keys 参数;它默认设置为 TRUE。这与 PHP 5.1.6 中的行为一致,该版本缺少此参数。
-3
enelar at develop-project dot ru
7 年前
生成器方法

function scandir_deep($dir)
{
foreach (scandir($dir) as $key => $value)
if (in_array($value, [".",".."]))
continue;
else if (is_dir($dir . DIRECTORY_SEPARATOR . $value))
yield $value => scandir_deep($dir . DIRECTORY_SEPARATOR . $value);
else
yield $value;
}
To Top