>  기사  >  백엔드 개발  >  PHP+Mysql에서 무제한 분류를 구현하는 방법

PHP+Mysql에서 무제한 분류를 구현하는 방법

coldplay.xixi
coldplay.xixi앞으로
2020-08-15 16:58:453357검색

PHP+Mysql에서 무제한 분류를 구현하는 방법

무한 분류는 오래된 주제입니다. PHP와 Mysql을 결합하여 구현하는 방법을 살펴보겠습니다.

[관련 학습 권장 사항: php 프로그래밍(동영상), mysql 동영상 튜토리얼]

첫 번째 방법

이 방법은 매우 일반적이고 전통적인 방법입니다. 먼저 테이블 구조를 살펴보세요

테이블 : Category
id int 기본 키, 자동 증가
name varchar 카테고리 이름
pid int 부모 클래스 id, 기본값 0
최상위 카테고리의 pid는 기본적으로 0입니다. 특정 카테고리의 하위 카테고리 트리를 꺼내려는 경우 기본 아이디어는 재귀입니다. 물론 효율성 문제로 인해 모든 재귀에 대해 데이터베이스를 쿼리하는 것은 권장되지 않습니다. 카테고리를 지정하고 이를 PHP 배열에 저장한 후 처리하고 마지막으로 결과를 캐시하여 다음 요청의 효율성을 향상시킵니다.

먼저 데이터베이스에서 직접 가져올 수 있는 원본 배열을 만듭니다.

코드는 다음과 같습니다.

$categories = array(
    array('id'=>1,'name'=>'电脑','pid'=>0),
    array('id'=>2,'name'=>'手机','pid'=>0),
    array('id'=>3,'name'=>'笔记本','pid'=>1),
    array('id'=>4,'name'=>'台式机','pid'=>1),
    array('id'=>5,'name'=>'智能机','pid'=>2),
    array('id'=>6,'name'=>'功能机','pid'=>2),
    array('id'=>7,'name'=>'超级本','pid'=>3),
    array('id'=>8,'name'=>'游戏本','pid'=>3),
);

목표는 이를 다음 구조로 변환하는 것입니다.

Computer
  Laptop
     Ultrabook
     Game Notebook
데스크탑 머신
휴대전화
스마트폰
기능성 전화기
배열로 표현되는 경우 하위 카테고리를 저장하기 위한 하위 키를 추가할 수 있습니다.

코드는 다음과 같습니다.

array(
    //1对应id,方便直接读取
    1 => array(
        'id'=>1,
        'name'=>'电脑',
        'pid'=>0,
        children=>array(
            &array(
                'id'=>3,
                'name'=>'笔记本',
                'pid'=>1,
                'children'=>array(
                    //此处省略
                )
            ),
            &array(
                'id'=>4,
                'name'=>'台式机',
                'pid'=>1,
                'children'=>array(
                    //此处省略
                )
            ),
        )
    ),
    //其他分类省略
)

처리 프로세스:

코드는 다음과 같습니다.

$tree = array();
//第一步,将分类id作为数组key,并创建children单元
foreach($categories as $category){
    $tree[$category['id']] = $category;
    $tree[$category['id']]['children'] = array();
}
//第二部,利用引用,将每个分类添加到父类children数组中,这样一次遍历即可形成树形结构。
foreach ($tree as $k=>$item) {
    if ($item['pid'] != 0) {
        $tree[$item['pid']]['children'][] = &$tree[$k];
    }
}
print_r($tree);

Print 결과는 다음과 같습니다.

코드는 다음과 같습니다.

Array
(
    [1] => Array
        (
            [id] => 1
            [name] => 电脑
            [pid] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [name] => 笔记本
                            [pid] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 7
                                            [name] => 超级本
                                            [pid] => 3
                                            [children] => Array
                                                (
                                                )
                                        )
                                    [1] => Array
                                        (
                                            [id] => 8
                                            [name] => 游戏本
                                            [pid] => 3
                                            [children] => Array
                                                (
                                                )
                                        )
                                )
                        )
                    [1] => Array
                        (
                            [id] => 4
                            [name] => 台式机
                            [pid] => 1
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [2] => Array
        (
            [id] => 2
            [name] => 手机
            [pid] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [name] => 智能机
                            [pid] => 2
                            [children] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 6
                            [name] => 功能机
                            [pid] => 2
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [3] => Array
        (
            [id] => 3
            [name] => 笔记本
            [pid] => 1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 7
                            [name] => 超级本
                            [pid] => 3
                            [children] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 8
                            [name] => 游戏本
                            [pid] => 3
                            [children] => Array
                                (
                                )
                        )
                )
        )
    [4] => Array
        (
            [id] => 4
            [name] => 台式机
            [pid] => 1
            [children] => Array
                (
                )
        )
    [5] => Array
        (
            [id] => 5
            [name] => 智能机
            [pid] => 2
            [children] => Array
                (
                )
        )
    [6] => Array
        (
            [id] => 6
            [name] => 功能机
            [pid] => 2
            [children] => Array
                (
                )
        )
    [7] => Array
        (
            [id] => 7
            [name] => 超级本
            [pid] => 3
            [children] => Array
                (
                )
        )
    [8] => Array
        (
            [id] => 8
            [name] => 游戏本
            [pid] => 3
            [children] => Array
                (
                )
        )
)

장점: 관계가 명확하고 상하 관계 수정이 간단합니다.

단점: PHP를 사용하여 처리하면 카테고리 수가 많으면 효율성도 떨어집니다.

두 번째 방법

이 방법은 테이블 필드에 경로 필드를 추가하는 것입니다.

Table:category
id int 기본 키, 자동 증가
name varchar 카테고리 이름
pid int 상위 클래스 ID, 기본값 0
path varchar path
예제 데이터:

id pid pid path
1 컴퓨터 0
2 휴대폰 0
3 노트북 1 0-1
4 울트라북 3 0-1-3
5 게임용 노트북 3 0-1-3
경로 필드는 id+'-'로 표시되는 루트 카테고리에서 이전 상위 카테고리까지의 경로를 기록합니다.

이런 방식으로 컴퓨터 아래의 모든 하위 카테고리를 쿼리한다고 가정하면 하나의 SQL 문만 필요합니다.

path가 다음과 같은 카테고리에서 id,name,path를 선택합니다(select concat(path,'-',id, '%') id=1인 카테고리의 경로);
결과:

+----+-----------+-------+
| | 경로 |
+-------+-------+
| 0-1 |
| 3 |
| 5 | 게임북| 0-1-3 |
+----+----------+-------+
이 방법도 많은 사람들이 사용합니다 채택하여 요약했습니다:

장점: 쿼리가 쉽고 효율성이 높으며 경로 필드를 색인화할 수 있습니다.

단점: 노드 관계를 업데이트하는 것은 번거롭고 모든 하위 항목의 경로 필드를 업데이트해야 합니다.

위 내용이 이 글의 전체 내용입니다. 두 가지 방법 중 어떤 방법을 선호하시나요? 모두가 좋아하길 바랍니다.

관련 추천: 프로그래밍 비디오 강좌

위 내용은 PHP+Mysql에서 무제한 분류를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제