【PHP8.x】CHILD_FIRST定数の使い方

CHILD_FIRST定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

『CHILD_FIRST定数は、RecursiveIteratorIteratorクラスの動作モードを指定するための一つの値を表す定数です。この定数を指定すると、イテレータは木構造のような再帰的なデータ構造を走査する際に、まず子要素をすべて処理し、その後に親要素を処理するようになります。この処理順序は、一般的に「帰りがけ順(post-order traversal)」として知られています。この定数は、RecursiveIteratorIteratorクラスのインスタンスを生成する際のコンストラクタの第2引数に渡して使用します。具体的な利用例として、ディレクトリとその中にあるファイルやサブディレクトリをすべて削除する処理が挙げられます。この場合、先に中身である子要素を削除してからでなければ、親であるディレクトリを削除することはできません。CHILD_FIRSTモードを使用することで、このような構造の末端要素からルート要素に向かって順に処理を実行するロジックを簡単に実装できます。対照的に、親要素を先に処理するSELF_FIRSTモードもあり、実現したい処理に応じて適切なモードを選択することが重要です。』

構文(syntax)

1<?php
2
3$data = [
4    'root_1',
5    'parent_1' => [
6        'child_1',
7        'child_2',
8    ],
9    'root_2',
10];
11
12$arrayIterator = new RecursiveArrayIterator($data);
13
14// 子要素を先に処理し、その後に親要素を処理するモードでイテレータを作成します。
15$iterator = new RecursiveIteratorIterator(
16    $arrayIterator,
17    RecursiveIteratorIterator::CHILD_FIRST
18);
19
20foreach ($iterator as $key => $value) {
21    $indent = str_repeat('  ', $iterator->getDepth());
22    if ($iterator->hasChildren()) {
23        echo $indent . "$key (親要素)\n";
24    } else {
25        echo $indent . "$key => $value (子要素)\n";
26    }
27}

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

RecursiveIteratorIterator::CHILD_FIRST は、イテレータの走査順序を指定する定数です。この定数を使用すると、親要素よりも子要素を先に走査するようになります。