PHP Conference Japan 2024

iterator_to_array

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

iterator_to_array將迭代器複製到陣列中

說明

iterator_to_array(Traversable|陣列 $iterator, 布林值 $preserve_keys = true): 陣列

將迭代器中的元素複製到一個陣列中。

參數

iterator

要複製的迭代器。

preserve_keys

是否使用迭代器元素的鍵值作為索引。

如果鍵值是 陣列物件,將會產生警告。null 鍵值會被轉換為空字串,浮點數 鍵值會被截斷為其對應的 整數資源 鍵值會產生警告並轉換為其資源 ID,而 布林值 鍵值會被轉換為整數。

注意事項:

如果此參數未設定或設定為 true,重複的鍵值將會被覆蓋。具有相同鍵值的最後一個值將會出現在返回的 陣列 中。將此參數設定為 false 可以取得所有值。

返回值

一個包含 iterator 元素的 陣列

更新日誌

版本 說明
8.2.0 iterator 的類型已從 Traversable 擴展為 Traversable|陣列

範例

範例 #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"
}

新增筆記

使用者貢獻的筆記 5 則筆記

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(); ?> 產生一個無限的費波那契數列,這是有效的,因為它實際上是一個無限數列,因此嘗試將其轉換為陣列將會失敗。
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"
)
joksnet at gmail dot com
10 年前
用於從巢狀迭代器產生深度陣列

<?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
Harry Willis
9 年前
在 SplObjectStorage 物件上使用 iterator_to_array() 時,建議將 $use_keys 設為 false。

產生的陣列是相同的,因為 SplObjectStorage::key() 產生的迭代器鍵值始終是從 0 到 (COUNT-1) 的整數。傳遞 $use_keys=false 可以省去不必要的 SplObjectStorage::key() 呼叫,從而略微提高效能。
enelar at develop-project dot ru
7 年前
產生器方法

函式 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