用嵌套列出所有类别的话,才20几个类,就要用20几个query,效率确定不行。

解决方案 »

  1.   

    function getCategoryArray()
    {
        $m = $s = 0;
    $sqlCategory = "SELECT * FROM `".TABLE_CATEGORY."` ORDER BY `cat_order` DESC,`cat_id`  ASC";
    $query = $this->db->query($sqlCategory);
    while ( $row = $this->db->fetch_array( $query ) ) 
            {
    if($_GET['CH']==$row[cat_id])
    {
    $this->getCategoryInfo = $row;
    }
    if($this->setCategoryListParentID==$row['parent_id'] && $row['cat_hide']=='N')
    {
    $this->getCategoryMenuList[$m]['catId'] = $row[cat_id];
        if($row['show_kind']=='text')
       $this->getCategoryMenuList[$m]['column'] = $row['cat_name'];
        elseif($row['show_kind']=='logo')
       $this->getCategoryMenuList[$m]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'">';
        elseif($row['show_kind']=='text_logo')
       $this->getCategoryMenuList[$m]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'"><BR>'.$row['cat_name'];
        else
       $this->getCategoryMenuList[$m]['column'] = '';
    $m++;
    }
    if($_GET['CH']==$row['parent_id'] && $row['parent_id']!=0 && $row['cat_hide']=='N' )
    {
    $this->getCategoryNextMenuList[$s]['catId'] = $row[cat_id];
        if($row['show_kind']=='text')
       $this->getCategoryNextMenuList[$s]['column'] = $row['cat_name'];
        elseif($row['show_kind']=='logo')
       $this->getCategoryNextMenuList[$s]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'">';
        elseif($row['show_kind']=='text_logo')
       $this->getCategoryNextMenuList[$s]['column'] = '<img src="'.$row[menu_logo].'" border=0 title="'.$row['cat_name'].'"><BR>'.$row['cat_name'];
        else
       $this->getCategoryNextMenuList[$s]['column'] = '';
    $s++;
    }
    //
                    $this->categoryArray[$row[parent_id]][$row[cat_id]] 
                    = array( 
                            'cat_id'       => $row[cat_id],
                            'parent_id'    => $row[parent_id],
                            'cat_name'     => $row[cat_name],
        'cat_type'     => $row[cat_type],
        'cat_url'      => $row[cat_url],
        'cat_validate' => $row[cat_validate],
        'cat_order'    => $row[cat_order],
                    );
                    $this->catFatherArray[$row[cat_id]][$row[parent_id]] 
                    = array( 
                            'cat_id'       => $row[cat_id],
                            'parent_id'    => $row[parent_id],
                            'cat_name'     => $row[cat_name],
        'cat_type'     => $row[cat_type],
        'cat_url'      => $row[cat_url],
        'cat_validate' => $row[cat_validate],
        'cat_order'    => $row[cat_order],
                    );
            } 
    $this->db->free_result( $query );

    }
      

  2.   

    <?php
    require "main.php";
    $db1=NewADOConnection(SH_DB_TYPE);
        $db1->Connect(SH_DB_HOST,SH_DB_USER,SH_DB_PWD,SH_DB_NAME)or die ("不能连接数据库");
        $query1="select * from cate";
        $result1=$db1->Execute($query1) or die("数据库错误,请联系管理员");
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>无标题文档</title>
    </head>
    <body><form name="form1" method="post" action="">
      <p>&nbsp;</p>
      <p>    <select name="select2">
     <? while(!$result1->EOF)
    {  $categoryid=$result1->fields[0];
    echo "<p><option>"."-*".$result1->fields[1]."*-"."</option></p>";
        $db2=NewADOConnection(SH_DB_TYPE);
        $db2->Connect(SH_DB_HOST,SH_DB_USER,SH_DB_PWD,SH_DB_NAME)or die ("不能连接数据库");
        $query2="select * from class where class_cateid=$categoryid";
        $result2=$db2->Execute($query2) or die("数据库错误,请联系管理员");
    while($row2=$result2->FetchNextObject())
    {
    echo "<option value=$row2->SOCLASS_ID>".$row2->SOCLASS_NAME."</option></p>";
    }
    $result1->MoveNext();
    }
         ?>
                </select>
    </p>
     
      <p>&nbsp;</p>
      <p>&nbsp;</p>
      <p>&nbsp;</p>
    </form>
    </body>
    </html>
      

  3.   

    上面我就是列出TABLE_CATEGORY中所有的数据后,在类中再进行嵌套循环在整个系统中只读取一次数据库
      

  4.   

    呵呵,给你们一个最简单的算法好了,
    <?php$data = array(array('id'=>1, name=>'name1', 'pid'=>0),
                  array('id'=>2, name=>'name1', 'pid'=>1),
                  array('id'=>3, name=>'name1', 'pid'=>0),
                  array('id'=>4, name=>'name1', 'pid'=>3),
                  array('id'=>5, name=>'name1', 'pid'=>0),
                  array('id'=>6, name=>'name1', 'pid'=>2),
                  array('id'=>7, name=>'name1', 'pid'=>6),
                  array('id'=>8, name=>'name1', 'pid'=>4),
                  array('id'=>9, name=>'name1', 'pid'=>7)
    );
    $level = $result = array();
    foreach($data as $value){
    $level[$value['pid']][$value['id']] = 'END';
    }
    $result = $level[0];
    doLevel($level, $result);function doLevel(&$level,&$result){
       foreach($result as $key=>$value){
          if(isset($level[$key])){
           $result[$key] = $level[$key];
           doLevel(&$level, &$result[$key]);
          }
      }
    }
    echo "<pre>"; print_R($result);?>
    整个代码分为几个部分:
    第一步从数据库中选出所有的分类
    上面的例子中($data是我从数据库中选出来的分类的结果集),第二步通过循环制作一个数据等级二维数组。第三步通过递归函数生成一个用分类的id值作为键值的多位数组,这个数组就是最后的等技数组。第四步打印出来结果集。结果有两个部分可以用
    $data存储分类信息。
    $result存储等级信息。------------------------------------------------------------
    如果你是从数据库选。可以把$data的负值语句删了,
    把foreach($data as $value)改成
    foreach($value = $this->db->fetch_array($query))就可以了
    具体的事例如下:<?php$sqlCategory = "SELECT * FROM catogory";
    $query = $this->db->query($sqlCategory);
    $level = $result = array();
    foreach($value = $this->db->fetch_array($query)){
    $level[$value['pid']][$value['id']] = 'END';
    }
    $result = $level[0];
    doLevel($level, $result);function doLevel(&$level,&$result){
       foreach($result as $key=>$value){
          if(isset($level[$key])){
           $result[$key] = $level[$key];
           doLevel(&$level, &$result[$key]);
          }
      }
    }
    echo "<pre>"; print_R($result);?>
      

  5.   

    我的方法很简单,一个level字段填入一个分类的所有父ID(包括自己),然后如此Select即可:
    Select * from 'class' where parid = 0 order by level
    很方便,能树型列出来,不过排序是个问题.暂时还没时间解决
      

  6.   

    不可能啊,我这里可打印出来啊,这个是我刚才看了这个帖子才意兴大发,花了半个小时考虑出来的啊,不要打击我,呵呵。
    --------------------------------------------------------
    肯定可以运行的,代码不会有问题的。等级树的样式如下
    ******注意看,数组的建值****
    Array
    (
        [1] => Array
            (
                [2] => Array
                    (
                        [6] => Array
                            (
                                [7] => Array
                                    (
                                        [9] => END
                                    )                        )                )        )    [3] => Array
            (
                [4] => Array
                    (
                        [8] => END
                    )        )    [5] => END
    )------------------------------------------------------
    可以不用递归,可以参考xml_parse_into_struct生成的结果集的样式处理。
    生成两个数组,样式如下
    $aaaa['id'] = 'pid'
    $bbbb['pid'] = 'id'
    然后再处理成多维数组
      

  7.   

    不错不错,.你在数组里添加一个order,再按照order排序看看,嘿嘿
      

  8.   

    http://www.phpx.com/happy/thr62348.html速度N快.