PHPにおける再帰と多次元構造
任意のレベルのネストを持つ多次元配列があるとします。 例えば、以下のようなものです:
<?php
$arr = [
1,
[
2, 7, 8
],
[
3, 4, [5, [6, 7]],
]
];
?>
ご覧の通り、この配列は複雑な構造を持ち、 この構造は任意であり、ネストのレベルはいくらでも 深くなり得ると想定されています。
この配列のすべてのプリミティブ (つまり配列ではない)要素を画面に表示したいとします。 この場合、このような配列を走査するために 単純にループを使用することはできません。 なぜなら、配列は不規則な構造を持ち、 ネストのレベルが不明だからです。
しかし、このような配列を走査するには、 再帰を使うと非常に便利です。
まず、パラメータとして配列を受け取る関数を作成し、 関数内で配列を走査するためのループを作ります:
<?php
function func($arr) {
foreach ($arr as $elem) {
echo $elem;
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
私たちが作ったループは、
メイン配列の要素のみを走査します。
つまり、最初に1を出力し、
次に[2, 7, 8]、
そして[3, 4, [5, [6, 7]]を出力します。
それでは、ループ内でプリミティブ要素と配列要素を 区別するようにしましょう:
<?php
function func($arr) {
foreach ($arr as $elem) {
if (is_array($elem)) {
// 要素 - 配列
} else {
// 要素 - プリミティブ
echo $elem;
}
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
そして、要素が配列の場合、 関数が自分自身を呼び出し、その配列をパラメータとして 渡すようにしましょう:
<?php
function func($arr) {
foreach ($arr as $elem) {
if (is_array($elem)) {
func($elem);
} else {
echo $elem;
}
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
?>
任意のレベルのネストを持つ多次元配列があるとします。 例えば、以下のようなものです:
<?php
$arr = [1, 2, 3, [4, 5, [6, 7]], [8, [9, 10]]];
?>
再帰を使って、この配列のすべてのプリミティブ 要素を画面に表示してください。