PHP: yinelemeli ebeveyn çocuklarını almak

3 Cevap php

Benim DB bir ebeveynin tüm çocukların kimlikleri alır bir işlevi var. Ben id 7 baktım Yani, bu 5, 6 ve 10 ile bir dizi döndürebilir. Daha sonra ne yapmak istiyorum, özyinelemeli çocukların nihai derinliği, böylece bu döndürülen kimlikleri çocukları bulmak ve.

Bunu yapmak için bir fonksiyon yazmak için çalıştık, ama ben özyineleme hakkında karıştı alıyorum.

function getChildren($parent_id) {
    $tree = Array();
    $tree_string;
    if (!empty($parent_id)) {
        // getOneLevel() returns a one-dimentional array of child ids
        $tree = $this->getOneLevel($parent_id);
        foreach ($tree as $key => $val) {
            $ids = $this->getChildren($val);
            array_push($tree, $ids);
            //$tree[] = $this->getChildren($val);
            $tree_string .= implode(',', $tree);
        }

        return $tree_string;
    } else {
        return $tree;
    }

}//end getChildren()

Fonksiyonu çalıştırıldıktan sonra, bunu tespit edilen tüm alt kimlikleri bir tek-boyutlu bir dizi dönmek istiyorum.

3 Cevap

Bu benim için çok iyi çalışıyor:

function getOneLevel($catId){
    $query=mysql_query("SELECT categoryId FROM categories WHERE categoryMasterId='".$catId."'");
    $cat_id=array();
    if(mysql_num_rows($query)>0){
        while($result=mysql_fetch_assoc($query)){
            $cat_id[]=$result['categoryId'];
        }
    }   
    return $cat_id;
}

function getChildren($parent_id, $tree_string=array()) {
    $tree = array();
    // getOneLevel() returns a one-dimensional array of child ids        
    $tree = $this->getOneLevel($parent_id);     
    if(count($tree)>0 && is_array($tree)){      
        $tree_string=array_merge($tree_string,$tree);
    }
    foreach ($tree as $key => $val) {
        $this->getChildren($val, &$tree_string);
    }   
    return $tree_string;
}

Call the getChildren(yourid); Then it will return the complete array of children for that given node/parent.

Nested Set Model instead of Adjacency List Model


Ben ALM yerine NSM altında veritabanındaki düğümleri saklamak önerebilirsiniz?

ALM, (ne kullanıyorsanız olan) çocukların düğümleri almak oldukça zor, onun mümkündür, ancak ekstra çalışma gerektirir ile dikkat edin. Eğer bir çocuk düğüm veya tüm düğümlerin seçimi, hatta bulma iç içe set modelini kullanırsanız tüm düğümlerin derinliği tek bir SQL sorgusu yapılabilir.

Şimdi proje anahtarlama gelişme hala genç, daha sonra baş ağrısı bir çok kazandıracak eğer ben, bu sizin sorunu nasıl çözebileceklerini biraz ışık tutuyor umuyoruz.

Yerine array_push($tree, $ids); try $tree = array_merge($tree, $ids);. $tree_string .= implode(',', $tree); öldürmek ve sadece return $tree. (Once)

function getChildren($parent_id) {
    $tree = Array();
    if (!empty($parent_id)) {
        $tree = $this->getOneLevel($parent_id);
        foreach ($tree as $key => $val) {
            $ids = $this->getChildren($val);
            a$tree = array_merge($tree, $ids);
        }
    }
    return $tree;
}