$f=array();
$list=array();
$db->query("select * from test order by parent_id");
while($rs=$db->fetch()){
$f[$rs['id']]['name']=$rs['name'];
if(!$rs['parent_id']){
$list[]=&$f[$rs['id']];
}else{
$f[$rs['parent_id']]['sub'][$rs['id']]=&$f[$rs['id']];
}
}
function show($list,$tab='')
{
if(!is_array($list)){
echo $list;
return;
}
foreach($list as $k=>$v){
echo $tab."⊥".$v['name']."<br>";
show($v['sub'],$tab."&nbsp;&nbsp;");
}
}
show($list);

解决方案 »

  1.   

    id  parentid  classname   表的设计
    1      0       新闻
    2      1       国内
    3      1       国外
    4      1       大陆
    5      0       笑话
    6      5       子栏目
    7      5       子栏目
    8      7       子栏目的子栏目
    9      7       子栏目的子栏目
    10     7       子栏目的子栏目先说下表的设计,其中表的父id为0的表示为最顶级的分类(或者节点),id为自动.
    <?php
    $list=array();
    $sub=array();/*子类显示的函数
    $array = 显示数组
    $index = 索引
    $sub_char = 子分类的装饰字符 ⊥
    $split_char = 分隔符 这里是tab(8个空格)
    */
    function show_list($array, $index, $sub_char, $split_char = "\t") { 
    static $s = 1;
    if(is_array($array[$index])) {
    foreach($array[$index] as $class) {
    echo str_repeat($split_char, $s).$sub_char.$class['classname']."\n";
    if(is_array($array[$class['id']])) {
    $s++;
    show_list($array, $class['id'], $sub_char, $split_char);

    }
    }
    if($s > 1) $s--;
    }mysql_connect('localhost', 'test', '') or die(mysql_error());
    mysql_select_db('test') or die(mysql_error()); 
    mysql_query("set names 'gbk'");
    $result = mysql_query("select * from test order by id");
    while($rs = mysql_fetch_array($result, MYSQL_ASSOC)) {
    if($rs['parentid'] == 0) {
    $list[] = $rs; //保存顶级分类
    } else {
    $sub[$rs['parentid']][] = $rs;  //子分类
    }
    }echo '<pre>';
    if(is_array($list)) {
    foreach($list as $class) {
    echo '-'.$class['classname']."\n";
    show_list($sub, $class['id'], '⊥');
    }
    }
    echo '</pre>'