Php 如何为mlm项目创建合适的递归函数

Php 如何为mlm项目创建合适的递归函数,php,recursion,Php,Recursion,我有各种各样的解决方案从SO创建我的第一个传销项目,但现在我陷入了总下行数通过递归函数,因为我不知道这一点,请任何人帮助我 我的数据库表结构如下表名成员: `成员id |成员名称|节点左|节点右 成员关系如下: member_id (Id 101) /\ / \ node_left(Id 102) node_right(Id 103) /\ /\

我有各种各样的解决方案从SO创建我的第一个传销项目,但现在我陷入了总下行数通过递归函数,因为我不知道这一点,请任何人帮助我

我的数据库表结构如下表名成员:

`成员id |成员名称|节点左|节点右

成员关系如下:

         member_id (Id 101)
               /\
              /  \
node_left(Id 102)  node_right(Id 103)
              /\                 /\
             /  \         blank /  \blank
(again) blank   node_right (104)
。。。。。。等等以上只是一个例子

`

现在我需要计算所有成员的下线总数。例如:假设上面的例子,我想知道成员_id 101的总下线 如何创建以有限循环结束的递归函数


请告诉我任何想法。

我不确定您是否尝试在此处实现,但实现看起来不正确

对于嵌套集,表示树结构的左/右值如下所示:

member 101 (root): left=1, right=8
member 102: left=2, right=5
member 103: left=3, right=4
member 104: left=6, right=7
然后,计算成员101的子女数将非常简单:

SELECT COUNT(*) FROM member WHERE node_left > 1 AND node_right < 8

您可以从下面的代码中使用/创建您自己的定制功能,只需检查它并尝试针对您的情况实施即可

    function Recursive_getsubcategory($parent_id,$cat_group,$intLevel)

{
        global $intLevel;


    $sql = "select *,".$intLevel." as level from tbl_name where parent_id = '".$parent_id."' ";

    $result = mysql_query($sql);
    $cat_name = $result->fetch_array_multiple();

    if(count($cat_name) > 0)
    {   
        for($k=0;$k<count($cat_name);$k++)
        { 
            $cat_group[] = array('id'=>$cat_name[$k]['sub_id'],
                                        'parent_id'=>$cat_name[$k]['parent_id'],
                                        'level' =>  $cat_name[$k]['level']

                                        );

$parent_id[] = $cat_name[$k]['parent_id'];              

//Function For Recursive Get Sub Category...
Recursive_getsubcategory($cat_name[$k]['ebay_sub_id'],$cat_group,$intLevel++);
        }

    }
    // count of total downline nodes
return count($cat_group);
}


此代码可能对您的任务有帮助。

所示的表结构基本上是邻接列表设计,不适合处理SQL中的分层数据。有关更好的替代方案,请参阅。@outis:它似乎是一个嵌套集设计,而不是邻接列表。@Rijk:每个节点向其两个子节点存储一条边,与用于邻接的标准模式相反,但邻接,而不是子树的边界。注意,对于根,你有101,“…”,102,103;104不在范围内,尽管它是后代。@outis:你似乎是对的。。我已经添加了一个解释嵌套集模型的答案。mysql扩展正在被弃用,不应该用于新代码。应该使用准备好的语句,而不是将变量直接插入语句中,因为它们在重复查询时更安全、更快。不要使用;仅选择所需的列。代码中的不可读$intLevel不应声明为全局;它只能作为参数传递。无需将$intLevel添加到SELECT。mysql\u查询返回一个资源,而不是一个对象,并且没有fetch\u array\u multiple方法。在循环中增加$intLevel意味着后续的同级将依次记录在较低的级别;另一方面,一个数组。循环体执行两个不必要的任务:不需要记录每个父ID,特别是在调用函数时它们都是相同的;不需要记录$cat_组中的每个项目,因为您只需要大小。