찾다
php教程php手册PHP实现查询多级分类的程序代码

无限级分类是我们常用见的一个程序方法了,原理是得到有层级关系的数组,就是顶级是顶级分类,然后每个分类中有个children子数组,记录它的子分类,这样一级一级的分级数组.

算法的数据库结构设计最为简单,category表中一个字段id,一个字段fid(父id),这样可以根据WHERE id = fid来判断上一级内容,运用递归至最顶层.

我们先查出数组,代码如下:

<?php
$a = array(
    &#39;AAAAAA&#39; => array(
        &#39;aaaaaa&#39; => array(
            &#39;111111&#39;,
            &#39;222222&#39;,
            &#39;333333&#39;
        ) ,
        &#39;bbbbbb&#39; => array(
            &#39;111111&#39;,
            &#39;222222&#39;,
            &#39;333333&#39;
        ) ,
        &#39;cccccc&#39; => array(
            &#39;111111&#39;,
            &#39;222222&#39;,
            &#39;333333&#39;
        ) ,
    ) ,
    &#39;BBBBBB&#39; => array(
        &#39;aaaaaa&#39; => array(
            &#39;111111&#39;,
            &#39;222222&#39;,
            &#39;333333&#39;
        ) ,
        &#39;bbbbbb&#39; => array(
            &#39;111111&#39;,
            &#39;222222&#39;,
            &#39;333333&#39;
        ) ,
        &#39;cccccc&#39; => array(
            &#39;111111&#39;,
            &#39;222222&#39;,
            &#39;333333&#39;
        ) ,
    ) ,
    &#39;CCCCCC&#39; => array(
        &#39;aaaaaa&#39; => array(
            &#39;111111&#39;,
            &#39;222222&#39;,
            &#39;333333&#39;
        ) ,
        &#39;bbbbbb&#39; => array(
            &#39;111111&#39;,
            &#39;222222&#39;,
            &#39;333333&#39;
        ) ,
        &#39;cccccc&#39; => array(
            &#39;111111&#39;,
            &#39;222222&#39;,
            &#39;333333&#39;
        ) ,
    ) ,
);
foreach ($a as $k => $v) {
    echo $k . "<br>";
    // if(is_array($v)){
    foreach ($v as $key => $val) {
        echo "  " . $key . "<br>";
        //     }
        if (is_array($val)) {
            foreach ($val as $kkk => $vall) {
                echo "    " . $vall . "<br>";
            }
        }
    }
    echo "<br>";
}
/*******mysql查询无限级分类的代码******/
/***
   $sql = "SELECT a.Title AS big, b.Title AS small  
            FROM largeTitle AS a LEFT JOIN smallTitle  AS b ON  a.ID=b.LargeID"; 
             
    $a = array(); 
     
    $r = mysql_query($sql); 
     
    while( $arr = mysql_fetch_array($r)){ 
        $a[$arr[&#39;big&#39;]] = $arr[&#39;small&#39;]; 
    } 
    ***/
?>

好了下面先读取数据库然后再递归读出.

分类表,比如category,字段有 id,parentid,title,代码如下:

<?php
//查询
$dsql->SetQuery("SELECT * FROM category ORDER BY sortorder ASC");
$dsql->Execute(&#39;parentlist&#39;);
$array = array();
$parentlist = array();
while ($rs = $dsql->getObject(&#39;parentlist&#39;)) {
    if ($rs->parentid == 0) {
        $parentlist[$rs->id] = (array)$rs;
    } else {
        $array[$rs->id] = (array)$rs;
    }
}
$parentlist = cat_options($parentlist, $array); //我们求的结果数组
//$list父级分类的数组
//$array是除父级分类外的全部分类的数组
function cat_options(&$list, &$array) {
    foreach ($list as $key => $arr) {
        foreach ($array as $k => $value) {
            if ($value[&#39;parentid&#39;] == $arr[&#39;id&#39;]) {
                $list[$key][&#39;children&#39;][] = $value;
                unset($array[$k]);
            }
        }
    }
    foreach ($list as $key => $arr) {
        if (is_array($arr[&#39;children&#39;]) && count($arr[&#39;children&#39;]) > 0) {
            $list[$key][&#39;children&#39;] = cat_options($list[$key][&#39;children&#39;], $array);
        }
    }
    return $list;
}
?>

其它的方法,设置fid字段类型为varchar,将父类id都集中在这个字段里,用符号隔开,比如:1,3,6,这样可以比较容易得到各上级分类的ID,而且在查询分类下的信息的时候,可以使用:SELECT * FROM category WHERE pid LIKE "1,3%",代码如下:

--  
-- 表的结构 `category`  
--  
CREATE TABLE IF NOT EXISTS `category` (  
`id` int(11) NOT NULL AUTO_INCREMENT,  
`type` int(11) NOT NULL COMMENT &#39;1为文章类型2为产品类型3为下载类型&#39;,  
`title` varchar(50) NOT NULL,  
`lft` int(11) NOT NULL,  
`rgt` int(11) NOT NULL,  
`lorder` int(11) NOT NULL COMMENT &#39;排序&#39;,  
`create_time` int(11) NOT NULL,  
PRIMARY KEY (`id`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;  
--  
-- 导出表中的数据 `category`  
--  
INSERT INTO `category` (`id`, `type`, `title`, `lft`, `rgt`, `lorder`, `create_time`) VALUES  
(1, 1, &#39;顶级栏目&#39;, 1, 18, 1, 1261964806),  
(2, 1, &#39;公司简介&#39;, 14, 17, 50, 1264586212),  
(3, 1, &#39;新闻&#39;, 12, 13, 50, 1264586226),  
(4, 2, &#39;公司产品&#39;, 10, 11, 50, 1264586249),  
(5, 1, &#39;荣誉资质&#39;, 8, 9, 50, 1264586270),  
(6, 3, &#39;资料下载&#39;, 6, 7, 50, 1264586295),  
(7, 1, &#39;人才招聘&#39;, 4, 5, 50, 1264586314),  
(8, 1, &#39;留言板&#39;, 2, 3, 50, 1264586884),  
(9, 1, &#39;总裁&#39;, 15, 16, 50, 1267771951);

 

<?php
/**  
 * 显示树,把所有的节点都显示出来。
 * 1、先得到根结点的左右值(默认根节点的title为"顶级目录")。
 * 2、查询左右值在根节点的左右值范围内的记录,并且根据左值排序。
 * 3、如果本次记录右值大于前次记录的右值则为子分类,输出时候加空格。
 * @return array
 *
 */
function display_tree() {
    //获得root左边和右边的值
    $arr_lr = $this->category->where("title = &#39;顶级栏目&#39;")->find();
    //print_r($arr_lr);
    if ($arr_lr) {
        $right = array();
        $arr_tree = $this->category->query("SELECT id, type, title, rgt FROM category WHERE lft >= " . $arr_lr[&#39;lft&#39;] . " AND lft <=" . $arr_lr[&#39;rgt&#39;] . " ORDER BY lft");
        foreach ($arr_tree as $v) {
            if (count($right)) {
                while ($right[count($right) - 1] < $v[&#39;rgt&#39;]) {
                    array_pop($right);
                }
            }
            $title = $v[&#39;title&#39;];
            if (count($right)) {
                $title = &#39;|-&#39; . $title;
            }
            $arr_list[] = array(
                &#39;id&#39; => $v[&#39;id&#39;],
                &#39;type&#39; => $type,
                &#39;title&#39; => str_repeat(&#39; &#39;, count($right)) . $title,
                &#39;name&#39; => $v[&#39;title&#39;]
            );
            $right[] = $v[&#39;rgt&#39;];
        }
        return $arr_list;
    }
}
?>

好了 只要这样所有的分类都可以一次性查询出来了,而不用通过递归了.


永久链接:

转载随意!带上文章地址吧。

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경