beklendiği gibi php tekrarlama fonksiyonu çalışmıyor

2 Cevap php
private function find_children ($parent_id, $children, &$result)
{              
    foreach ($children as $c)
    {            
        if ($c->parent_comment_id == $parent_id)
        {                
            $result[] = $c;
            $this->find_children($c->id, $children, $result);            
        }            
    }
    return;        
}

Yukarıdaki fonksiyon bir başlangıç ​​ebeveyn kimliği almak ve ardışık numune için aşağıya bakın (her düğümün ebeveyn var sonra doğrudan gelir böylece onları sıralama (benzersiz bir kimliği ve bir üst kimliği ile gerçekten sadece bir nesne) çocuk düğümler bir dizi geçmesi gerekiyordu veri).

Ama nedense, fonksiyon beklediğim gibi çalışmayan. Ben test için aşağıdaki verileri var.

id: 1 pid: 0 (the initial parent which is not in the children array passed to func. problem?)
id: 2 pid: 1
id: 3 pid: 2
id: 4 pid: 1
id: 5 pid: 3
id: 6 pid: 5
id: 7 pid: 4
id: 8 pid: 3

and want the following array returned: 1, 4, 7, 2, 3, 8, 5, 6

But instead, I get: 1, 2, 3, 5, 6

hangi onlar doğru sırayla yaparken, birkaç eksik.

Ben yıllardır özyineleme yapmak ihtiyacı vardı, bu yüzden büyük olasılıkla ben belirgin bir şey eksik, kendime o kadar belirgin olmasa da. Değil

Durumda herkes merak ediyor, ya da bu konularda, ben q ve her yazı birden çok cevap olabilir bir yorum sistemi oluşturmaya çalışıyorum.

Böylece:

initial post 
-reply to initial post #1
--reply to reply
-reply to initial post #2
-- reply to above
--- reply to above
--reply to #2

2 Cevap

Ben bir iç içe Set Ağacı gibi bir şey arıyorsanız düşünüyorsun?

Bu göz atın:

http://www.edutech.ch/contribution/nstrees/index.php

İstediğin ne yapmalıyım.

I belirtilen veriler üzerinde işlevini çalıştırdığınızda, i tarif sipariş almak, ama ben herhangi bir öğe eksik değilim:

id: 1, pid:0
id: 2, pid:1
id: 3, pid:2
id: 5, pid:3
id: 6, pid:5
id: 8, pid:3
id: 4, pid:1
id: 7, pid:4

Ve bu sonuç, aslında sadece id yıllara göre artan sipariş istediğiniz ağaç yapısı vardır. Eğer id yıllara göre azalan sizin chhildren-dizi sipariş ederseniz, o zaman gerçekten istemek çıktı almak yapın:

id: 1, pid:0
id: 4, pid:1
id: 7, pid:4
id: 2, pid:1
id: 3, pid:2
id: 8, pid:3
id: 5, pid:3
id: 6, pid:5

Eğer DB azalan verileri almak emin olun. Bu non-DB test için, ben find_children çağırmadan önce aşağıdaki kullanarak düzelttim ():

function revCmpObjects($a, $b) { //Just a basic descending ordering by the id
   if ($a->id == $b->id) {
       return 0;
   }
   return ($a->id > $b->id) ? -1 : 1;
}
usort($children, 'revCmpObjects'); //The actual sorting