PHP Conference Japan 2024

RecursiveArrayIterator 類別

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

簡介

此迭代器允許在迭代陣列和物件時取消設定和修改值和鍵,與 ArrayIterator 的方式相同。此外,還可以迭代目前的迭代器項目。

類別概要

class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator {
/* 繼承的常數 */
/* 常數 */
公開 常數 整數 CHILD_ARRAYS_ONLY;
/* 方法 */
/* 繼承的方法 */
公開 ArrayIterator::__construct(陣列|物件 $array = [], 整數 $flags = 0)
}

預定義常數

RecursiveArrayIterator 旗標

RecursiveArrayIterator::CHILD_ARRAYS_ONLY

在遞迴迭代中,僅將陣列(而非物件)視為具有子項目。

目錄

新增註解

使用者貢獻的註解 4 則註解

c dot 1 at smithies dot org
13 年前
如果您正在迭代一個多維物件陣列,您可能會想在 RecursiveIteratorIterator 中使用 RecursiveArrayIterator。如果您這樣做,您可能會得到令人困惑的結果。這是因為 RecursiveArrayIterator 將所有物件都視為具有子項,並嘗試遞迴到它們。但如果您希望 RecursiveIteratorIterator 返回多維陣列中的物件,則您不希望使用預設設定 LEAVES_ONLY,因為沒有物件可以是葉子(= 沒有子項)。

解決方案是擴展 RecursiveArrayIterator 類別並適當地覆寫 hasChildren 方法。類似以下的程式碼可能適用:

<?php
class RecursiveArrayOnlyIterator extends RecursiveArrayIterator {
public function
hasChildren() {
return
is_array($this->current());
}
}
?>
當然,這個簡單的例子也不會遞迴到 ArrayObjects!
mccarthy dot richard at gmail dot com
13 年前
使用 RecursiveArrayIterator 遍歷外層陣列中未知數量的子陣列。注意:RecursiveIteratorIterator 已經提供了此功能,但在第一次使用迭代器時,了解如何使用迭代器還是很有用的,因為所有術語在第一次看到 SPL 時確實會讓人感到困惑!

<?php
$myArray
= array(
0 => 'a',
1 => array('subA','subB',array(0 => 'subsubA', 1 => 'subsubB', 2 => array(0 => 'deepA', 1 => 'deepB'))),
2 => 'b',
3 => array('subA','subB','subC'),
4 => 'c'
);

$iterator = new RecursiveArrayIterator($myArray);
iterator_apply($iterator, 'traverseStructure', array($iterator));

function
traverseStructure($iterator) {

while (
$iterator -> valid() ) {

if (
$iterator -> hasChildren() ) {

traverseStructure($iterator -> getChildren());

}
else {
echo
$iterator -> key() . ' : ' . $iterator -> current() .PHP_EOL;
}

$iterator -> next();
}
}
?>

輸出結果如下:
0 : a
0 : subA
1 : subB
0 : subsubA
1 : subsubB
0 : deepA
1 : deepB
2 : b
0 : subA
1 : subB
2 : subC
4 : c
lemoinem dot remove at me dot mlemoine dot name
10 年前
c dot 1 at smithies dot org 提出的 RecursiveArrayOnlyIterator 行為也可以使用(未記錄的)標誌 RecursiveArrayIterator::CHILD_ARRAYS_ONLY 來實現(https://github.com/php/php-src/blob/master/ext/spl/spl_array.c#L1970 以及 https://github.com/php/php-src/blob/master/ext/spl/spl_array.c#L1620
Edgar
2 年前
<?php
$array
= [
'A','B',
'C'=>[
'D','E',
'F'=>['G','H']
],
'I','J'
];

$iterator = new RecursiveArrayIterator($array);

foreach(
$iterator as $key=>$value)
{
echo
$key,':', $value,'<br>';
}

/**
輸出
0:A
1:B
C:Array
2:I
3:J
*/

//-------------
//遞迴...

$array = [
'A','B',
'C'=>[
'D','E',
'F'=>['G','H']
],
'I','J'
];

$it = new RecursiveArrayIterator($array);
$iterator = new RecursiveIteratorIterator($it);

foreach(
$iterator as $key=>$value)
{
echo
$key,':', $value,'<br>';
}

/**
輸出
0:A
1:B
0:D
1:E
0:G
1:H
2:I
3:J
*/

?>
To Top