ツリーに変換する必要がある 2 次元の PHP 配列があります。各内部配列の「パス」値は、現在のノードへの列挙パスです。(このアイデアは、Bill Karwin の SQL Antipatterns に関する本から得ました)。
したがって、私が始めている配列は次のようになります。
array(
[1] => array('name' => 'Animals', 'path' => '1/'),
[2] => array('name' => 'Birds', 'path' => '1/3/'),
[3] => array('name' => 'Cockatoos', 'path' => '1/3/5/'),
[4] => array('name' => 'Fish', 'path' => '1/2/'),
[5] => array('name' => 'Kookaburras', 'path' => '1/3/4/')
)
お気づきかもしれませんが、外側の配列のインデックスは無意味です。「名前」で内側の配列をアルファベット順に並べただけで、PHP は外側の配列に数値インデックスを割り当てました。
「パス」値に関する限り、各パスの最後のセグメントはノードの疑似 ID です。つまり、動物はノード 1、鳥はノード 3 です。完全なパスが指定された場所へのルートを記述していることがわかります。ノード、たとえば、'Cockatoos' は 'Birds' の親になり、'Birds' は 'Animals' の親になります。
ノードのアルファベット順を維持したいのですが、親でグループ化します。つまり、次のような配列が必要です (自然な順序で):
[1] => 'Animals'
[1][3] => 'Birds'
[1][3][5] => 'Cockatoos'
[1][3][4] => 'Kookaburras'
[1][2] => 'Fish'
これを再帰的に繰り返して、ツリーの視覚的表現を出力する予定です。
あるタイプの配列から別のタイプの配列に変換しようとする際に、私のアプローチでは再帰、変数変数、および正規表現を使用しましたが、障害が発生し続けています。
また、考えるべき SPL データ構造または反復子はありますか?
どうもありがとう!
編集:申し訳ありませんが、ツリーの深さは可変であることに言及する必要がありました。上記の例では 3 つのレベルがありますが、実際にはさらに多くのレベルがあります。
キム