现在算法和代码如下
 $bigTopic=array();
 $bigIS=array();
 $bigNum=0;
  while($row=$tmp->getRow()){
  if($row['isSub']==0)
  { //如果是父类。
            if($bigIS[$row['artcleID']]=='')
  { //没有登记的父类
$bigTopic[$bigNum]['artcleID']=$row['artcleID'];
$bigTopic[$bigNum]['artcleName']=$row['artcleName'];
$bigTopic[$bigNum]['subNum']=0;
$bigIS[$row['artcleID']]=$bigNum;
$bigNum++;
  }else
  { //已经登记的父类
     $bigTopic[$bigIS[$tmp->Fields("artcleID")]]['artcleID']=$row['artcleID'];
 $bigTopic[$bigIS[$tmp->Fields("artcleID")]]['artcleName']=$row['artcleName'];
  }
  }else
  { //如果是子类
     if($bigIS[$row['fatherID']]=='')
 {
                //父类没有登录记过,创建一个新的父类
    $bigTopic[$bigNum]['artcleID']='';
                $bigTopic[$bigNum]['artcleName']='';
$bigTopic[$bigNum]['subNum']=0;
$bigTopic[$bigNum]['sub'][$bigTopic[$bigNum]['subNum']]['artcleID']=$row['artcleID'];
$bigTopic[$bigNum]['sub'][$bigTopic[$bigNum]['subNum']]['artcleName']=$row['artcleName'];
    $bigIS[$row['fatherID']]=$bigNum;
    $bigNum++;
 }else
 {  
 //父类已经登记过了。直接加入子类
    $bigTopic[$bigIS[$row['fatherID']]['sub'][$bigTopic[$bigIS[$row['fatherID']]['subNum']]['artcleID']=$row['artcleID'];
$bigTopic[$bigIS[$row['fatherID']]['sub'][$bigTopic[$bigIS[$row['fatherID']]['subNum']]['artcleName']=$row['artcleName'];
$bigTopic[$bigIS[$row['fatherID']]['subNum']++;
             }
  }
 }
    //树形输出
    for($i=0;$i<$bigNum;$i++)
{  //父类输出
   $SelectStr.="<option value=".$bigTopic[$i]['artcleID'].">".$bigTopic[$i]['artcleName']."</option>";
   for($j=0;$j<$bigTopic[$i]['subNum'];$j++)
   {  //子类输出
      $SelectStr.="<option value=".$bigTopic[$i]['sub'][$j]['artcleID'].">&nbsp;&nbsp;|_".$bigTopic[$i]['sub'][$j]['artcleName']."</option>";
   }
}

解决方案 »

  1.   

    数据量大时,进行order by排序会占用很多时间的么?
      

  2.   

    Good Good Study ! Day Day UP !
      

  3.   

    其实不要order by也可以,只要把数据取出来就搞定了。
    不过这个只能分二级。
    现在有数组也比较清晰,有四个成员。sub下再带一个数组而已
    其实我原来也用过一种无限树算法。
    用了递归算法,我也怕多了慢才没有用
    下面递归函数,因为我在一个类中用,这是结合class.tree用的
    //传入路径。
    $tree = new Tree("class/tree/");
    $tree->message="";$root=$tree->open_tree("","");    
    //$rowNum是数组下标最大值,也就是个数
    //$rowArr是数组,0,0,是初始化
    $this->add_topic($rowArr,$rowNum,$tree,$root,0,0); $tree->close_tree();
    //输出无限树
    echo $tree->message;
    //=====================================================
    //递归函数
    function add_topic(&$row,$num,&$tree,&$root,$temp,$j)
        {
            $is=0;//先设为0,然后进入递归
            for($i=0;$i<$num;$i++)
            {
              if($row[$i][parentID]==$temp)
              {
               $is=1;
               if($temp!='0')
               { 
     //添加节点
                $node=$tree->add_folder($root,$row[$j][topicName],"");
                for($n=$i;$n<$num;$n++)
                {
                 if($row[$n][parentID]==$temp)
                      {  
         //递归
                        $this->add_topic($row,$num,$tree,$node,$row[$n][topicID],$n);            
                      }
                     }
                     break;
                    }else
                    {
                      for($n=0;$n<$num;$n++)
                      {
                        if($row[$n][parentID]==$temp)
                        { //递归
                          $this->add_topic($row,$num,$tree,$root,$row[$n][topicID],$n);
                        } 
                      } 
                     break;
                    }
               }          
            }
    //当不能递归下去时开始加入项目
            if($is=='0')
            {
                if($this->topicID=='')
                {   //$this->topicID是当前栏目也就是说当前节点
                    $this->topicID=$row[$j][topicID];
                    $this->name=$row[$j][topicName];              
                }
    //加入项目
                $tree->add_document($root,$row[$j][topicName],$row[$j][topicID]); 
                return 0; 
            }        
         }
      }
      

  4.   

    复制到editPlus看下吧,
    现在想想当时怎么做出来的。
    看看都有点头晕。
    可能结合前面那个算法,可以更加简单和更加快。
     for($i=0;$i<$num;$i++)
            {
              if($row[$i][parentID]==$temp)
              {
    这里可以改成前面的算法思想,这样比较完美了.
    发现看下以前写的程序也挺有意思的。
    本人水平有限,希望高人也拿点出来分享下。
    分数嘛,当然不会给太少
      

  5.   

    不错,但是看起来不简洁,为什么不用你以前的想法?用SQL语句看起来可能查询多了点但是数据库都是优化过的,但也不会很慢的,你可以试试:
    $query = "Select p1.*, p2.* from ppw_article AS p1, ppw_article AS p2 ".
             "Where p1.fatherID = p2.articleID AND p1.isSub=1 AND p2.isSub=0 ";
    $res = mysql_query($query, $link);
    while ($row = mysql_fetch_array($res))
    {
        $Topic[$row[p2.articleID]][$row[p1.articleID]][] = $row[p1.articleName];
        $Topic[$row[p2.articleID]][$row[p1.articleID]][] = $row[p2.articleName];
    }比你写的至少看起来简洁,但是具体效率怎么样就不知道了
      

  6.   

    回复人:ashchen(陈辉) ( 一星(中级)) 信誉:120  2005-01-10 23:07:00  得分:0

    隔段时间看看以前自己写的程序就觉得脸红。
    =====================same feel
      

  7.   

    赞同 flyonet(人生如梦【★】梦如人生)TO:jakey9826(无眠) 你做过测试吗?
      

  8.   

    Meteorlet(Meteorlet) ( ) 信誉:104 
    那个也不错,
    不错查出数据多了点
      

  9.   

    //如果是子类
         if($bigIS[$row['fatherID']]=='')
     {
                    //父类没有登录记过,创建一个新的父类
        $bigTopic[$bigNum]['artcleID']='';
                    $bigTopic[$bigNum]['artcleName']='';
    $bigTopic[$bigNum]['subNum']=0;
    $bigTopic[$bigNum]['sub'][$bigTopic[$bigNum]['subNum']]['artcleID']=$row['artcleID'];
    $bigTopic[$bigNum]['sub'][$bigTopic[$bigNum]['subNum']]['artcleName']=$row['artcleName'];
        $bigIS[$row['fatherID']]=$bigNum;
    /////////////////////////////////////////////////////////////////////////////
    //修正一个小bug,如果子类排在父类前第一个子类会被复盖掉。
    //加入下面一行
        $bigTopic[$bigNum]['subNum']=1;
    ////////////////////////////////////////////////////////
        $bigNum++;