$arr = array(array("user_id"=>1,"username"=>"士兵","pid"=>0));
$arr[] = array("user_id"=>9,"username"=>"士兵","pid"=>1);
$arr[] = array("user_id"=>2,"username"=>"士兵","pid"=>1);
$arr[] = array("user_id"=>3,"username"=>"士兵","pid"=>4);
$arr[] = array("user_id"=>4,"username"=>"士兵","pid"=>7);
$arr[] = array("user_id"=>5,"username"=>"士兵","pid"=>7);
$arr[] = array("user_id"=>6,"username"=>"士兵","pid"=>2);
$arr[] = array("user_id"=>7,"username"=>"士兵","pid"=>3);
$arr[] = array("user_id"=>8,"username"=>"士兵","pid"=>3);
//统计某节点下面所有节点总和,包括孙子,孙子的孙子一直到没有为止
function tjjd_count($s)
{
global $arr;
$num = 0;
foreach($arr as $k=>$val){
if($val['pid']==$s){
$num = $num + 1;
}

}
}
//测试
echo tjjd_count(1);
写了一半,突然没法下手了,可能要递归开始了,可是我不会用。谁帮我下好吗,求求你们了。PHP

解决方案 »

  1.   

    4
    3
    7
    8
    4的pid又为7 这不死循环了 你的树有问题啊
    function tjjd($arr,$s){
    $num = 0;
    foreach ($arr as $key => $value) {
    if($value['pid']==$s){
    $num++;
    print_r($value['user_id']);
    tjjd($arr,$value['user_id']);
    }
    }
    return $num;
    }
    echo tjjd($arr,1);你搞一个正常的树结构 用这个函数试试呢
      

  2.   


    $arr = array(array("user_id"=>1,"username"=>"士兵","pid"=>0));
    $arr[] = array("user_id"=>9,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>2,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>3,"username"=>"士兵","pid"=>4);
    $arr[] = array("user_id"=>4,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>5,"username"=>"士兵","pid"=>4);
    $arr[] = array("user_id"=>6,"username"=>"士兵","pid"=>2);
    $arr[] = array("user_id"=>7,"username"=>"士兵","pid"=>3);
    $arr[] = array("user_id"=>8,"username"=>"士兵","pid"=>3);如果user_id是1的话。是那个最顶层的根节点。那么下面所有的节点都是他的子节点。你这个算法貌似有点问题。这个我统计echo tjjd($arr,1);的结果是3,好像不对。
      

  3.   

    这个树有问题吗,朋友。我看看,好像没啥问题。pid为4的有3
    pid为3的有7
    pid为7的有8
    4又成了7的子节点  ..... 
      

  4.   

    这个树有问题吗,朋友。我看看,好像没啥问题。pid为4的有3
    pid为3的有7
    pid为7的有8
    4又成了7的子节点  ..... 

    $arr = array(array("user_id"=>1,"username"=>"士兵","pid"=>0));
    $arr[] = array("user_id"=>9,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>2,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>3,"username"=>"士兵","pid"=>4);
    $arr[] = array("user_id"=>4,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>5,"username"=>"士兵","pid"=>4);
    $arr[] = array("user_id"=>6,"username"=>"士兵","pid"=>2);
    $arr[] = array("user_id"=>7,"username"=>"士兵","pid"=>3);
    $arr[] = array("user_id"=>8,"username"=>"士兵","pid"=>3);
    这个是我改过的,没问题。但是用你那个不能完全统计出结果。
      

  5.   

    这个树有问题吗,朋友。我看看,好像没啥问题。pid为4的有3
    pid为3的有7
    pid为7的有8
    4又成了7的子节点  ..... 

    $arr = array(array("user_id"=>1,"username"=>"士兵","pid"=>0));
    $arr[] = array("user_id"=>9,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>2,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>3,"username"=>"士兵","pid"=>4);
    $arr[] = array("user_id"=>4,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>5,"username"=>"士兵","pid"=>4);
    $arr[] = array("user_id"=>6,"username"=>"士兵","pid"=>2);
    $arr[] = array("user_id"=>7,"username"=>"士兵","pid"=>3);
    $arr[] = array("user_id"=>8,"username"=>"士兵","pid"=>3);
    这个是我改过的,没问题。但是用你那个不能完全统计出结果。
    在num++上面 打印一句 在看答应的个数好像是对的  应该++哪里的问题 我想想在来看看
      

  6.   

    仅统计子孙的数量是不需要递归的$arr = array(
      array("user_id"=>1,"username"=>"士兵","pid"=>0),
        array("user_id"=>9,"username"=>"士兵","pid"=>1),
        array("user_id"=>2,"username"=>"士兵","pid"=>1),
          array("user_id"=>6,"username"=>"士兵","pid"=>2),
        array("user_id"=>4,"username"=>"士兵","pid"=>1),
          array("user_id"=>3,"username"=>"士兵","pid"=>4),
            array("user_id"=>7,"username"=>"士兵","pid"=>3),
            array("user_id"=>8,"username"=>"士兵","pid"=>3),
          array("user_id"=>5,"username"=>"士兵","pid"=>4),
    );echo tjjd_count($arr, 1); //8function tjjd_count($ar, $p) {
      $t = array();
      do {
        $n = count($t);
        foreach($ar as $v) {
          if($v['pid'] == $p || in_array($v['pid'], $t)) {
             $t = array_unique(array_merge($t, array($v['user_id'])));
          }
        }
      }while(count($t) != $n);
      return $n;
    }
      

  7.   

    这个树有问题吗,朋友。我看看,好像没啥问题。pid为4的有3
    pid为3的有7
    pid为7的有8
    4又成了7的子节点  ..... 

    $arr = array(array("user_id"=>1,"username"=>"士兵","pid"=>0));
    $arr[] = array("user_id"=>9,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>2,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>3,"username"=>"士兵","pid"=>4);
    $arr[] = array("user_id"=>4,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>5,"username"=>"士兵","pid"=>4);
    $arr[] = array("user_id"=>6,"username"=>"士兵","pid"=>2);
    $arr[] = array("user_id"=>7,"username"=>"士兵","pid"=>3);
    $arr[] = array("user_id"=>8,"username"=>"士兵","pid"=>3);
    这个是我改过的,没问题。但是用你那个不能完全统计出结果。
    在num++上面 打印一句 在看答应的个数好像是对的  应该++哪里的问题 我想想在来看看$num=0;
    function tjjd_count($s)
    {
    global $arr;
    global $num;
    foreach($arr as $k=>$val){
    if($val['pid']==$s){
    $num++;
    tjjd_count($val['user_id']);
    }

    }
    return $num;
    }
    你的问题出在,递归这里。递归一次num清零了。所以统计不全。得把num放在外面。怎么能不放外面就能统计出来呢。
      

  8.   

    我想问个问题:是全部统计么,不管哪一层?那统计user_id不就得了? 除非user_id有重复count($arr);
      

  9.   


    function tjjd_count($s,$num=0)
    {
    global $arr;
    foreach($arr as $k=>$val){
    if($val['pid']==$s){
    $num++;
    tjjd_count($val['user_id'],$num);
    }

    }
    return $num;
    }
    这么做,可能是对的。每次递归的时候,顺带着,把num传过去,在累加。在递归,在传。在累加,反复如此。只能说我看结果,是没有问题。不知对不对。
      

  10.   


    <?php
    $arr = array(array("user_id"=>1,"username"=>"士兵","pid"=>0));
    $arr[] = array("user_id"=>9,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>2,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>3,"username"=>"士兵","pid"=>4);
    $arr[] = array("user_id"=>4,"username"=>"士兵","pid"=>1);
    $arr[] = array("user_id"=>5,"username"=>"士兵","pid"=>4);
    $arr[] = array("user_id"=>6,"username"=>"士兵","pid"=>2);
    $arr[] = array("user_id"=>7,"username"=>"士兵","pid"=>3);
    $arr[] = array("user_id"=>8,"username"=>"士兵","pid"=>3);//统计某节点下面所有节点总和,包括孙子,孙子的孙子一直到没有为止
    function tjjd($arr,$s){
    $tarr = array();
    $num = 0;
    foreach ($arr as $key => $value) {
    if($value['pid']==$s){
    $tarr[] = $s;
    //print_r($tarr);
    $tarr = array_merge($tarr,tjjd($arr,$value['user_id']));
    }
    }
    return $tarr;
    }
    //测试echo count(tjjd($arr,4));
    ?>
    这样就好了
      

  11.   

    递归可以这么写
    function tjjd_count($s)
    {
        global $arr;
        $num = 0;
        foreach($arr as $k=>$val){
            if($val['pid']==$s){
                $num++;
                $num += tjjd_count($val['user_id']);
            }
        }
        return $num;
    }但对于你主贴中的含有死循环的数据,将造成堆栈溢出
      

  12.   

    貌似找到了,一个类。http://hi.baidu.com/unphp/item/454da04e9aa86bf0dc0f6cf2
    写的非常复杂。汗一个先。