Ağaç düğümleri çocuk (recursive yardım fonksiyonu) almak nasıl

1 Cevap php

Ben bir ikili var, ilişkilerin veritabanı tablo şöyle:

+----+----------+---------+-----+
| id | parentID | childID | pos |
+----+----------+---------+-----+
|  1 |        1 |       2 | l   |
|  2 |        1 |       3 | r   |
|  3 |        2 |       4 | l   |
|  4 |        3 |       5 | r   |
|  5 |        4 |       6 | l   |
|  6 |        5 |       7 | r   |
+----+----------+---------+-----+

Ben ayıklamak mümkün duyuyorum ya da örneğin 1 için çocuklar - ama bunun için çok hantal bir işlevi var, bu yüzden daha iyi çalışır bir şey gerekir.

Ben ihtiyacım çıktı, bu gibi görünmelidir:

Array
(
    [0] => Array
        (
            [id] => 2
            [parentID] => 1
            [pos] => l
        )

    [1] => Array
        (
            [id] => 4
            [parentID] => 2
            [pos] => l
        )

    [2] => Array
        (
            [id] => 6
            [parentID] => 4
            [pos] => l
        )

    [3] => Array
        (
            [id] => 3
            [parentID] => 1
            [pos] => r
        )

    [4] => Array
        (
            [id] => 5
            [parentID] => 3
            [pos] => r
        )

    [5] => Array
        (
            [id] => 7
            [parentID] => 5
            [pos] => r
        )

)

Şimdiye kadar ancak ben basık istiyorum, iç içe geçmiş bir dizi döndürür ... ama ben denedim zaman sadece başarısız, bu fonksiyon ile geldi.

function children($pid) {
    //set sql
    $sql = "SELECT * FROM relationships WHERE parentID = ".$pid;	
    //save query to result
    $result = mysql_query ($sql)
    	or die("Bad request " . mysql_error());	

    while ($item = mysql_fetch_array($result)):
    	$topchild["id"] = $item["childID"];
    	$topchild["parentID"]= $item["parentID"];
    	$topchild["pos"] = $item["pos"];		

    	$children[] = $topchild;
    	$children[] = children($item["childID"]);		
    endwhile;


    	return $children;
}

Ben orada yanlış ne yapmalıyım?

1 Cevap

Ben basık istiyorum

$children[] = children($item["childID"]);

yerine ayrı ayrı dönüş değeri öğelerin her ekleyin:

foreach (children($item['childID'] as $child)
    $children[]= $child;

(Ayrıca $topchild döngü içinde başlatılmak olmamalı?)

Bu gibi özyinelemeli sorguları bir sürü yapıyorsanız, bir ebeveyn-çocuk ilişkisi tablo veri yapısının iyi bir seçim değildir. Böyle nested sets olarak hiyerarşik odaklı çözümlerden birini düşünün.