DBに格納されているノードの階層があります。すべてを選択し、それらを配列に格納してから、それらを繰り返し処理して、メモリ内にネストされた配列を作成します。
入力は次のようになります。
[{名前:A}、{名前:B}、{名前:X、親:A}、{名前:Y、親:A}、{名前:C}]
出力は次のようになります。
[{名前:A、子:[{名前:X}、{名前:Y}]}、{B}、{C}]
入れ子の深さに制限はありません。
私が抱えている問題は、レコードの1つに無効な親参照がある場合、そのレコードを階層に配置できず、スクリプトが無限ループで終了し、親を見つけようとすることです。
いつ無限ループに陥ったかを知る方法があるに違いない。記録のために、ループ内でアイテムを挿入する親がないことに気付いたとき、親が行の下流に存在する可能性があるため、配列の最後にアイテムをプッシュします。
同じアイテムを何度もサイクリングしていることに気付くはずだと思いますか?
編集1-コードこれは重要なビットです:
$cnt = count($array);
do {
$item = array_shift($array);
if ($this->push($item)) {
$cnt--;
} else {
array_push($array, $item);
}
} while ($cnt > 0);
($ this-> push()は親を見つけようとするメソッドであり、成功した場合は、その階層に$ itemを挿入します)