>  기사  >  백엔드 개발  >  PHP Mysql_php 예제의 무제한 분류를 구현하는 방법 요약

PHP Mysql_php 예제의 무제한 분류를 구현하는 방법 요약

WBOY
WBOY원래의
2016-05-16 20:22:34872검색

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

첫 번째 방법

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

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

먼저 데이터베이스에서 직접 가져올 수 있는 원본 배열을 구축하세요.

코드 복사 코드는 다음과 같습니다.

$categories = 배열(
Array('id'=>1,'name'=>'컴퓨터','pid'=>0),
array('id'=>2,'name'=>'휴대전화','pid'=>0),
array('id'=>3,'name'=>'노트북','pid'=>1),
array('id'=>4,'name'=>'Desktop','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),
);

다음과 같은 구조로 변환하는 것이 목표입니다

컴퓨터
노트
         울트라북
게임노트
데스크탑
휴대폰
스마트폰
기능폰
배열로 표시되는 경우 하위 카테고리를 저장하기 위해 하위 키를 추가할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

배열(
//1은 id에 해당하므로 직접 읽기에 편리합니다
1 => 배열(
         'id'=>1,
        '이름'=>'컴퓨터',
         'pid'=>0,
children=>배열(
              &배열(
                 'id'=>3,
                '이름'=>'노트북',
                 'pid'=>1,
              '어린이'=>배열(
//여기서는 생략
)
),
              &배열(
                 'id'=>4,
'이름'=>'데스크톱',
                 'pid'=>1,
              '어린이'=>배열(
//여기서는 생략
)
),
)
),
//그 외 카테고리는 생략
)

처리과정:

코드 복사 코드는 다음과 같습니다.

$tree = 배열();
//첫 번째 단계는 카테고리 ID를 배열 키로 사용하고 하위 유닛을 생성하는 것입니다
foreach($categories를 $category로){
$tree[$category['id']] = $category;
$tree[$category['id']]['children'] = 배열();
}
//두 번째 부분에서는 참조를 사용하여 상위 클래스의 하위 배열에 각 카테고리를 추가하므로 한 번의 순회로 트리 구조가 형성될 수 있습니다.
foreach ($tree를 $k=>$item으로) {
If ($item['pid'] != 0) {
$tree[$item['pid']]['children'][] = &$tree[$k];
}
}
print_r($tree);

인쇄 결과는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

배열
(
    [1] => 배열
        (
            [ID] => 1
            [이름] => 电脑
            [pid] => 0
            [어린이] => 배열
                (
                    [0] => 배열
                        (
                            [ID] => 3
                            [이름] => 笔记本
                            [pid] => 1
                            [어린이] => 배열
                                (
                                    [0] => 배열
                                        (
                                            [ID] => 7
                                            [이름] => 超级本
                                            [pid] => 3
                                            [어린이] => 배열
                                                (
                                                )
                                        )
                                    [1] => 배열
                                        (
~ ~ ~ [pid] =>3
[어린이] => 배열
(
)
)
)
)
[1] = & 배열
                      (
~ ~ [이름] =>데스크톱
[pid] => 1
[어린이] => 배열
                               (
)
)
)
)
[2] =>배열
(
> [이름] = & gt; 휴대폰
[pid] => > (
> >                                                           (
~ | [이름] => 스마트폰
[pid] => 2
[어린이] => 배열
                               (
)
)
[1] = & 배열
                (
>                                            [이름] => 기능폰
[pid] => 2
[어린이] => 배열
                               (
)
)
)
)
[3] => 배열
(
> [이름] = & 노트
> > (
> >                                                           (
부터 [이름] =>울트라북
[pid] =>3
[어린이] => 배열
                               (
)
)
[1] = & 배열
                (
~ ~ [이름] => 게임 노트
[pid] =>3
[어린이] => 배열
                               (
)
)
)
)
[4] =>배열
(
                                       [id] => > > > (
)
)
[5] =>배열
(
> [이름] = & gt; 스마트 머신
> > (
)
)
[6] =>배열
(
> [이름] = & 기능폰
> > (
)
)
[7] => 배열
(
> [이름] => [pid] => > (
)
)
[8] =>배열
(
>                                                 [이름] => [pid] => > (
)
)
)



장점: 관계가 명확하고 상하 관계를 수정하기 쉽습니다.
단점: 처리에 PHP를 사용하면 카테고리 수가 많으면 효율성도 떨어집니다.

두 번째 방법

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

id int 기본 키, 자동 증가

이름 varchar 카테고리 이름

pid int 상위 클래스 ID, 기본값 0

경로 varchar 경로
샘플 데이터:

아이디 이름 이름 pid 경로
1 컴퓨터 0 0
2 휴대폰 0 0

3 > >              ~에게  4 울트라북 3 0-1-3

5 게임노트 3 0-1-3
경로 필드는 ID '-'로 표시되는 루트 카테고리에서 상위 상위 카테고리까지의 경로를 기록합니다.

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

경로가 id=1인 범주의 경로로 (select concat(path,'-',id,'%')와 같은 경로가 있는 범주에서 id, 이름, 경로를 선택);
결과:

---- ----------- -------

| 아이디 | 이름 |

---- ----------- -------
|3 |노트 0-1 |

4 | 울트라북 | | 5 | 게임북 0-1-3 |

---- ----------- -------
이 방법 역시 많은 분들이 채택하고 계십니다. 정리하자면 다음과 같습니다.

장점: 쿼리 용이, 효율성 높음, 경로 필드 색인화 가능.

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

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

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