$newResult = array_merge($newResult,func($row['id'],$queryResult));
你那样写的话就把merge后的结果又追加到原来的数组里面了

解决方案 »

  1.   

    不建议使用递归关于三个字段无限分类的可以参考
    http://topic.csdn.net/u/20090311/15/637DE3A0-F2AB-4F5A-BDB2-D2B726F8F6C7.html 

    http://topic.csdn.net/u/20090312/19/998C593D-344A-42AE-B263-E9FF293299EE.html 
    里面我谈到的
      

  2.   

    3楼给的我有些地方看不懂啊,我想知道如果用我的方法哪里出错了,应该如何修改。
    $st1 =func(4,$resultArray); //id 4的所有子节点
    var_dump($st1);
    +----+--------+------+
    | id | parent | name |
    +----+--------+------+
    |  1 |      0 | 祖父   |
    |  3 |      1 | 叔伯   |
    |  2 |      1 | 父亲     |
    |  7 |      2 | 姐妹     |
    |  4 |      2 | 自己    |
    |  8 |      3 | 表亲     |
    |  5 |      4 | 儿子     |
    | 10 |      4 | 女儿    |
    | 12 |      5 | 孙女    |
    |  6 |      5 | 孙子     |
    |  9 |      7 | 甥儿     |
    | 11 |     10 | 外孙     |
    +----+--------+------+
    期望的结果是: 
       5 |      4 | 儿子   
    | 12 |      5 | 孙女    |
    |  6 |      5 | 孙子     |
      10 |      4 | 女儿 
    | 11 |     10 | 外孙    
    是一个一维数组,结果却变成如此,为什么?n维?
     
      

  3.   

    function func($id,array $queryResult) //入口是一个id值,表示查找所有子节点
    {
        $newResult = array();//存储结果
        foreach($queryResult as $num=>$row)
        {        if($row['parent'] == $id)  
            {
              
            $newResult[] = $row;
            $newResult[] = array_merge($newResult,func($row['id'],$queryResult));//这句改为:$newResult= array_merge($newResult,func($row['id'],$queryResult));[/
            }
        }
        return $newResult;
    }
    $newResult[] =XXX
    使递归的值成了子集,而不并列的值,得到的就不是一维,而是多维数组了
      

  4.   

    function func($id,array $queryResult) //入口是一个id值,表示查找所有子节点
    {
        $newResult = array();//存储结果
        foreach($queryResult as $num=>$row)
        {        if($row['parent'] == $id)  
            {
              
            $newResult[] = $row;
            $newResult[] = array_merge($newResult,func($row['id'],$queryResult));//这句改为:$newResult= array_merge($newResult,func($row['id'],$queryResult));[/
            }
        }
        return $newResult;
    }
      

  5.   

    感谢bingbin1321问题解决。另外问一个问题,是关于效率的。function func($id,array $queryResult) //入口是一个id值,表示查找所有子节点 

        $newResult = array();//存储结果 
        foreach($queryResult as $num=>$row) 
        {         if($row['parent'] == $id)  
            { 
              
            $newResult[] = $row; 
            $newResult[] = array_merge($newResult,func($row['id'],$queryResult));//这句改为:$newResult= array_merge($newResult,func($row['id'],$queryResult));[/ 
            } 
        } 
        return $newResult; 
    }这个函数的参数$queryResult是一个二维数组,那么函数调用时,是通过复制参数的方法传递的,因此,会复制一个$queryResult的二维数组,假如这个数组很大,而递归调用,每次也复制一次,假如有10层,等于复制了10个$queryResult的二维数组,这样消耗空间很大,有没有方法可以不通过参数复制的方法?而是一直用原数组,但是保证结果正确。我想到的是引用。但是每一次进入递归调用前必须把数组的index置前,同时本函数内的index不变。
      

  6.   

    一楼已经给出答复,怎么当时我没有注意到,晕,看来我被程序调试得头晕脑花了。同时完善一下这个函数:第一,增加一个参数$tag =0表示结果不包括自己,1时包括。
    第二,我楼上说的考虑效率。
    第三,增加参数$level,表示搜索深度。
      

  7.   

    可能吧,但是理解总有一个过程。以我现在的程度,这个不算好不算坏吧,这种算法最起码比计算一次就要向myslq取一次结果的好,这种算法最多向mysql搜索最多等于记录行数的次数,减少数据库压力,是一个进步,但是可能还有更好的算法。但是我暂时不知道,有时间再好好研究一下你给的例子,现在能完工把任务完成就行了。总之,谢谢所有楼上的。我说得:
    这个函数的参数$queryResult是一个二维数组,那么函数调用时,是通过复制参数的方法传递的,因此,会复制一个$queryResult的二维数组,假如这个数组很大,而递归调用,每次也复制一次,假如有10层,等于复制了10个$queryResult的二维数组,这样消耗空间很大,有没有方法可以不通过参数复制的方法?而是一直用原数组,但是保证结果正确。 我想到的是引用。但是每一次进入递归调用前必须把数组的index置首,同时本函数内的index不变。这个有没有帮忙解决啊。
      

  8.   

    我这个递归没有每次查询数据库了,一开始就把整个数据读入数组了,操作都是php在内存中操作了。我看过
    http://bbs.phpchina.com/viewthread.php?tid=80868&extra=&page=1
    我的这种算法应该比上述的好一些。
      

  9.   

    我这个递归没有每次查询数据库了,一开始就把整个数据读入数组了,操作都是php在内存中操作了。我看过
    http://bbs.phpchina.com/viewthread.php?tid=80868&extra=&page=1
    我的这种算法应该比上述的好一些。