繰り返し要素が二重になっている画面のデータ構造

ボタンのonclick()でAjaxを呼ぶなどして動的に増減するブロックがあったとする。
そのブロックの中にさらに別のAjax処理によって動的に増減する要素を組み込んでいる場合、
データ構造はどのようにしたらよいだろうか。


これは繰り返し要素の中にある繰り返し要素をどう扱えばいいかという問題だ。
二重になっている繰り返し要素の内側の要素を扱うには、紐づけられた外側の繰り返し要素が必要だ。


というわけで二次元配列的なデータ構造を思いつくだろうけれど、
外側の繰り返し要素が含んでいる、内側の繰り返し要素以外の要素を適切に扱えなくなってしまう。


以下のようなデータ構造ならできる。

   $arr = array(0 => 
                array('a_list' => 'aaa',
                      'b_list' => 'bbb',
                      'row_list' => array(
                                    0 => array('c_list' => 'ccc',
                                               'd_list' => 'ddd',
                                               'e_list' => 'eee',
                                         ),
                                    ),
                ),
          );

外側の繰り返し要素の為の配列の中に連想配列を持っている。連想配列の一要素(ここではrow_list)にさらに配列を持たせ、その中身が内側の繰り返し要素になる。
これを例えば以下のように二重のforeachの中で捌けばよさそうだ。

<?php foreach($arr as $tbl) :?>
	<table border="1">
	<tr>
		<td>
			<table border="1">
				<tr>
					<td>
						<?php echo $tbl['a_list'] ?>
					</td>
				<tr>
				<tr>
					<td>
						<?php echo $tbl['b_list'] ?>
					</td>
				</tr>
			</table>
		</td>
		<td>
			<table border="1">
				<?php foreach($tbl['row_list'] as $row) :?>
					<tr>
						<td>
							<?php echo $row['c_list'] ?>
						</td>
						<td>
							<?php echo $row['d_list'] ?>
						</td>
						<td>
							<?php echo $row['e_list'] ?>
						</td>
					</tr>
				<?php endforeach; ?>
			</table>
		</td>
	<table>
<?php endforeach; ?>

ちなみにこのデータ構造は、例えば以下のような形のダンプになる。

array(3) {
  [0]=>
  array(3) {
    ["a_list"]=>
    string(3) "aaa"
    ["b_list"]=>
    string(3) "bbb"
    ["row_list"]=>
    array(1) {
      [0]=>
      array(3) {
        ["c_list"]=>
        string(3) "ccc"
        ["d_list"]=>
        string(3) "ddd"
        ["e_list"]=>
        string(3) "eee"
      }
    }
  }
  [1]=>
  array(3) {
    ["a_list"]=>
    string(3) "ggg"
    ["b_list"]=>
    string(3) "hhh"
    ["row_list"]=>
    array(3) {
      [0]=>
      array(3) {
        ["c_list"]=>
        string(3) "iii"
        ["d_list"]=>
        string(3) "jjj"
        ["e_list"]=>
        string(3) "kkk"
      }
      [1]=>
      array(3) {
        ["c_list"]=>
        string(3) "iii"
        ["d_list"]=>
        string(3) "jjj"
        ["e_list"]=>
        string(3) "kkk"
      }
      [2]=>
      array(3) {
        ["c_list"]=>
        string(3) "iii"
        ["d_list"]=>
        string(3) "lll"
        ["e_list"]=>
        string(3) "mmm"
      }
    }
  }
  [2]=>
  array(3) {
    ["a_list"]=>
    string(3) "ggg"
    ["b_list"]=>
    string(3) "hhh"
    ["row_list"]=>
    array(2) {
      [0]=>
      array(3) {
        ["c_list"]=>
        string(3) "nnn"
        ["d_list"]=>
        string(3) "ooo"
        ["e_list"]=>
        string(3) "ppp"
      }
      [1]=>
      array(3) {
        ["c_list"]=>
        string(3) "qqq"
        ["d_list"]=>
        string(3) "rrr"
        ["e_list"]=>
        string(3) "sss"
      }
    }
  }
}

そこらへんで公開されているAPIの出力をパースした中身とよく似た形だなと思った。
何はともあれ、DBから取ってくるなりリクエストで投げられたなりしたデータをそのままループさせても無理なので、
この形にデータを整形しなおす前処理が必要になると思う。