$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
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);你搞一个正常的树结构 用这个函数试试呢
$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,好像不对。
pid为3的有7
pid为7的有8
4又成了7的子节点 .....
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);
这个是我改过的,没问题。但是用你那个不能完全统计出结果。
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++上面 打印一句 在看答应的个数好像是对的 应该++哪里的问题 我想想在来看看
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;
}
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放在外面。怎么能不放外面就能统计出来呢。
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传过去,在累加。在递归,在传。在累加,反复如此。只能说我看结果,是没有问题。不知对不对。
<?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));
?>
这样就好了
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;
}但对于你主贴中的含有死循环的数据,将造成堆栈溢出
写的非常复杂。汗一个先。