现在算法和代码如下
$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']."> |_".$bigTopic[$i]['sub'][$j]['artcleName']."</option>";
}
}
$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']."> |_".$bigTopic[$i]['sub'][$j]['artcleName']."</option>";
}
}
不过这个只能分二级。
现在有数组也比较清晰,有四个成员。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;
}
}
}
现在想想当时怎么做出来的。
看看都有点头晕。
可能结合前面那个算法,可以更加简单和更加快。
for($i=0;$i<$num;$i++)
{
if($row[$i][parentID]==$temp)
{
这里可以改成前面的算法思想,这样比较完美了.
发现看下以前写的程序也挺有意思的。
本人水平有限,希望高人也拿点出来分享下。
分数嘛,当然不会给太少
$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];
}比你写的至少看起来简洁,但是具体效率怎么样就不知道了
?
隔段时间看看以前自己写的程序就觉得脸红。
=====================same feel
那个也不错,
不错查出数据多了点
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++;