PHP RecursiveIteratorIterator ve iç içe setleri

2 Cevap php

Ben bir hierachy nesnelerin bir dizi var. Orada bir top "kök" düğüm var ve bu da ben her düğüm her bir "tarafı" tanımlamak için sayılı iç içe set modelini kullanarak bir DB içine bu yapıyı kurtarmak için çalışıyorum vs çocuk düğümleri çocuk düğümleri var hiyerarşi, gibi Managing Hierarchical Data in MySQL:

alt text

Benim sorunum sağ ve sol değerleri hesaplıyor. Ben genellikle hiyerarşi üzerinde yineleme için RecursiveIteratorIterator kullanabilirsiniz, ama ben referans bir endeks değişkeni ayrıştırır bir özyinelemeli işlevi başvurmadan sayıları hesaplamak için nasıl çalışmak olamaz.

Herhangi bir fikir?

Hiçbir kullanım muhtemelen, ama bu var şu anda (yanlış) kod:

$iterator = new RecursiveIteratorIterator(
    new Node_List(array($root)),
    RecursiveIteratorIterator::SELF_FIRST);

$i = 0;     
foreach ($iterator as $node) {
    $node->left = ++$i;
    $node->right = ++$i;
}

Gördüğünüz gibi, bu gibi bir şey vermek istiyorum:

Node 
    Node 
    Node 

Sol ve sağ değerler:

Node (1, 2)
    Node (3, 4)
    Node (5, 6)

Onlar olmalıdır zaman:

Node (1, 6)
    Node (2, 3)
    Node (4, 5)

2 Cevap

Ben bunu anladım, burada (simplifed) çözüm:

$iterator = new RecursiveIteratorIterator(
    new Site_Node_List(array($root)),
    RecursiveIteratorIterator::SELF_FIRST);

$sides = array();
$s = 0;
$i = 0;
$parents = array();
foreach ($iterator as $item) {
    $js = array_splice($parents, $depth, count($parents), array($i));
    foreach (array_reverse($js) as $j) {
    	$sides[$j]['right'] = ++$s;
    }
    $sides[$i]['left'] = ++$s;
    $i++;
}
foreach (array_reverse($parents) as $j) {
    $sides[$j]['right'] = ++$s;
}

Bu sadece, ayrı bir dizi "yan" değerlerini saklar gibi bu, benim gerçek kod basitleştirilmiş sürümü üzerine ÖS, ancak prensibi göstermektedir.

Temel fikir bir dizi (derinlik değeri ile izlenen) tüm üst düğümleri saklamak ve sadece döngü içinde "sol" değerleri yazmak olmasıdır. Ardından, derinliği geri hiyerarşisinde yukarıya gittim, bu yüzden anne dizisi artık alakalı olanları kaldırın dilinmektedir ve onlar "doğru" değerlerini ayarlayarak (tersten) üzerinden döngüye anlamına gelir azalır. Son olarak, sonunda kalan anne üzerinde döngü var.

Bu yineleme olmadan bu sorunu çözmek mümkün değildir. Aşağıdaki gibi bir şey gerekir:

function tag_recursive($node, &$number) {
    $node->left = $number++;
    foreach ($node->children as &$child) {
        tag_recursive($child, $number);
    }
    $node->right = $number++;
}

function tag($node) {
    $number = 1;
    tag_recursive($node, $number);
    // $number is now highest id + 1
}