RecursiveArrayIterator のパラメーターとして渡される再帰配列をどのように構造化するかの例を探しています。ID、parent_id、およびタイトルを持つmysqlテーブルがあります。
id parent_id title
-----------------|-------------------
1 0 | Item 1
2 1 | Item 2
3 1 | Item 3
4 3 | Item 4
5 4 | Item 5
ツリー、メニュー、オプションなどを構築するために RecursiveArrayIterator に渡すことができるテーブルから配列を作成したいと思います。この「build_tree」関数https://stackoverflow.com/a/8587437/1746522を試して、mysql テーブルから配列を作成しました。結果の配列は次のようになります。
array (size=2)
0 =>
array (size=3)
'id' => string '1' (length=1)
'title' => string 'Item 1' (length=6)
'parent_id' => string '0' (length=1)
'children' =>
array (size=2)
0 =>
array (size=3)
...
1 =>
array (size=3)
...
しかし、結果の配列を RecursiveArrayIterator に渡すと、奇妙に見えます。たとえば、この関数を使用すると:
$array = new RecursiveArrayIterator($tree);
$iterater = new RecursiveIteratorIterator($array);
foreach ($iterater as $key => $value) {
$d = $iterater->getDepth();
echo "depth=$d k=$key v=$value\n";
}
次のような奇妙で使用できない出力があります。
depth=0 k=0 v=Array
depth=1 k=id v=1
depth=1 k=title v=Item 1
depth=1 k=parent_id v=0
depth=2 k=0 v=Array
depth=3 k=id v=2
depth=3 k=title v=Item 2
depth=3 k=parent_id v=1
depth=4 k=0 v=Array
....
深さが間違っており、要素ではなく単一の値を反復処理します。おそらく RecursiveArrayIterator に渡された配列は「不正な形式」であり、他の方法で構造化する必要がありますか?
私はこのようなものを見ることを期待していました:
depth=0 k=1 v=Array
depth=1 k=2 v=Array
depth=1 k=3 v=Array
ここで、Array には、parent_id や title などのノードへのすべての値が含まれ、k は mysql 列 ID の ID です。