この問題では、要素のフラットな配列を階層ツリー状の構造に変換する必要があります。入力配列は、id、parentid、name の 3 つのプロパティを持つオブジェクトで構成されます。出力は、各ノードが入力配列内の要素を表し、それに属する子ノードのリストを持つツリー構造である必要があります。
この問題を解決するには、次の理由により、ネストされたセットのようなメソッドに依存することはできません。データベースの制約。代わりに、再帰アルゴリズムを利用してツリーを構築します。
$arr = array( array('id' => 100, 'parentid' => 0, 'name' => 'a'), array('id' => 101, 'parentid' => 100, 'name' => 'a'), array('id' => 102, 'parentid' => 101, 'name' => 'a'), array('id' => 103, 'parentid' => 101, 'name' => 'a'), ); $new = array(); foreach ($arr as $a) { $new[$a['parentid']][] = $a; } $tree = createTree($new, array($arr[0]));
最初のステップでは、入力配列をループし、要素を親 ID でグループ化し、各キーが親の ID を表す新しい配列を作成します。 、値はその子の配列です。次に、ヘルパー関数 createTree を呼び出して、ツリーを再帰的に構築します。
function createTree(&$list, $parent) { $tree = array(); foreach ($parent as $k => $l) { if (isset($list[$l['id']])) { $l['children'] = createTree($list, $list[$l['id']]); } $tree[] = $l; } return $tree; }
createTree 関数は、再編成された配列 $list と、ツリーの現在のレベルを表す配列 $parent の 2 つのパラメーターを受け取ります。関数内で、$parent 配列を反復処理し、$list に現在の要素の子が含まれているかどうかを検査します。子が見つかった場合は、createTree を再帰的に呼び出してその要素のサブツリーを構築し、それを現在の要素の Children プロパティとして追加します。最後に、現在の要素を $tree 配列に追加し、ツリーを返します。
このアルゴリズムに従うことで、提供された配列リストからツリー構造を効率的に構築し、要素間の階層関係のネストされた表現を生成できます。要素。
以上がフラット配列リストを階層ツリー構造に効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。