PHPにおける再帰と多次元構造

任意のレベルのネストを持つ多次元配列があるとします。 例えば、以下のようなものです:

php<?php
  $arr = [
    1,
    [
      2, 7, 8
    ],
    [
      3, 4, [5, [6, 7]],
    ]
  ];
?>

ご覧の通り、この配列は複雑な構造を持ち、 この構造は任意であり、ネストのレベルはいくらでも 深くなり得ると想定されています。

この配列のすべてのプリミティブ (つまり配列ではない)要素を画面に表示したいとします。 この場合、このような配列を走査するために 単純にループを使用することはできません。 なぜなら、配列は不規則な構造を持ち、 ネストのレベルが不明だからです。

しかし、このような配列を走査するには、 再帰を使うと非常に便利です。

まず、パラメータとして配列を受け取る関数を作成し、 関数内で配列を走査するためのループを作ります:

php<?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<?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<?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]]]]);
?>
Задание 1

任意のレベルのネストを持つ多次元配列があるとします。 例えば、以下のようなものです:

php<?php
  $arr = [1, 2, 3, [4, 5, [6, 7]], [8, [9, 10]]];
?>

再帰を使って、この配列のすべてのプリミティブ 要素を画面に表示してください。