はい、再帰を使用できます。配列内のすべての要素を出力する例を次に示します。
function printAll($a) {
if (!is_array($a)) {
echo $a, ' ';
return;
}
foreach($a as $v) {
printAll($v);
}
}
$array = array('hello',
array('world',
'!',
array('whats'),
'up'),
array('?'));
printAll($array);
再帰を行うときに常に覚えておくべきことは、これ以上深くはならない基本ケースが必要であるということです。
関数を続行する前に、ベースケースを確認するのが好きです。これは一般的なイディオムですが、厳密には必要ありません。出力するか再帰呼び出しを行う必要があるかどうかをループでチェックすることもできforeach
ますが、コードをそのように維持するのは難しいことがよくあります。
現在の入力と基本ケースの間の「距離」はバリアントと呼ばれ、整数です。バリアントは、すべての再帰呼び出しで厳密に減少する必要があります。前の例のバリアントはですthe depth of $a
。バリアントについて考えないと、無限の再帰が発生するリスクがあり、最終的にはスタックオーバーフローが原因でスクリプトが停止します。再帰関数の前に、バリアントがコメントに含まれていることを正確に文書化することは珍しくありません。