>  기사  >  백엔드 개발  >  php mysql_php 스킬의 무한 분류 예시에 대한 자세한 설명

php mysql_php 스킬의 무한 분류 예시에 대한 자세한 설명

WBOY
WBOY원래의
2016-05-16 20:25:43977검색

본 글의 예시에서는 php mysql에서 무제한 분류를 구현하는 방법을 설명하고 있습니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

1. 데이터베이스는 상위 클래스 ID를 설정하여 고유한 인덱싱을 수행한 다음 재귀 함수 호출을 사용하여 무제한 분류를 달성합니다.

2. 데이터베이스 설계는 특정 형식으로 배열된 다음 mysql을 사용하여 핵심 기능인 concat을 쿼리합니다. 먼저, 뉴스→라는 3단계 분류가 있다고 가정합니다. PHP 뉴스→PHP6.0이 나왔습니다.

"PHP6.0이 나왔습니다"라는 소식을 알고 싶다면 먼저 뉴스를 클릭한 후 PHP 뉴스를 클릭하여 알아보세요. 그러면 하위 클래스의 상위 클래스를 알고 있으면 이를 찾을 수 있습니다. 이러한 방식으로 데이터베이스를 설계할 때 상위 클래스 ID에 대한 추가 필드를 설계하여 무제한 분류를 달성할 수 있습니다. >

데이터베이스 코드는 다음과 같습니다.

여기서 "class" 테이블을 만듭니다.


코드 복사 코드는 다음과 같습니다.CREATE TABLE `class`(
`id` int(11) NOT NULL auto_increment COMMENT '카테고리 ID',
`f_id` int(11) NOT NULL COMMENT '부모 ID',
`name` varchar(25) collate gbk_bin NOT NULL COMMENT '카테고리 이름',
기본 키(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk COLLATE=gbk_bin AUTO_INCREMENT=1 ;

먼저 "News" 카테고리를 데이터베이스에 삽입합니다. "News"가 가장 큰 카테고리이고 상위 카테고리가 없기 때문에 해당 카테고리의 f_id를 0으로 설정합니다.


코드 복사 코드는 다음과 같습니다.INSERT INTO `class` (`id`, `f_id`,` name`) VALUES(1, 0, 'News'); //id 필드는 자동으로 커지므로 작성할 필요가 없습니다.
그런 다음 'PHP News' 카테고리를 데이터베이스에 삽입합니다. 해당 상위 카테고리 'News'의 ID는 1이므로 f_id는 1로 설정됩니다.


코드 복사

그런 다음 'PHP 6.0 is out' 카테고리를 데이터베이스에 삽입합니다. 상위 카테고리 'PHP News'의 ID는 2이므로 f_id는 2로 설정됩니다.


코드 복사

마찬가지로 카테고리를 아래로 끝까지 삽입하여 무한한 카테고리에 도달할 수 있습니다.
카테고리 삽입의 핵심은 이 카테고리의 상위 카테고리 ID를 찾아 이 카테고리의 f_id 필드 값으로 사용하는 것임을 알 수 있습니다.

'News'와 같은 수준에 'Technology' 카테고리를 삽입하려고 한다고 가정해 보겠습니다. 즉, 이 카테고리는 가장 큰 카테고리이고 그 위에 상위 카테고리가 없으며 해당 f_id도 0으로 설정됩니다. ;


코드 복사

'Technology' 아래에 또 다른 카테고리 'PHP Technology'가 있는데 어떻게 삽입하나요? 먼저 'PHP Technology'의 상위 클래스인 'Technology'의 ID를 찾은 다음 이를 자체 값으로 사용합니다. f_id 필드입니다.


코드 복사

이것을 보면 각 카테고리를 데이터베이스에 삽입하는 방법을 모두가 이해해야 한다고 생각하므로 예를 들어 설명하지 않겠습니다. 각 카테고리를 데이터베이스에 삽입하는 방법은 이미 알고 있으므로 각 카테고리를 어떻게 나열합니까?
php 예제 코드는 다음과 같습니다.


코드 복사

코드는 다음과 같습니다.
header("Content-type:text/html;charset=utf-8")
$db=new mysqli("localhost","root","","news_php100"); //데이터베이스 연결을 인스턴스화합니다. 이를 사용하기 전에 mysqli 클래스 라이브러리가 로드되었는지 확인하거나 mysql_connect를 사용하여 연결하십시오.
if(mysqli_connect_errno()){
echo "링크 실패:".mysqli_connect_error()
종료() }
$db->query("utf8 이름 설정"); $result=$db->query("f_id=0인 클래스에서 이름 선택"); //f_id=0인 카테고리, 즉 각 주요 카테고리를 찾습니다.
while($row=$result->fetch_assoc()){
echo $row['name']."
"; //각 주요 카테고리를 반복합니다.
}
//마찬가지로 뉴스의 하위 카테고리를 반복할 수 있습니다.
$result=$db->query("select * from class where f_id=1"); //f_id=1인 카테고리, 즉 'News'의 하위 카테고리를 찾습니다.
while($row=$result->fetch_assoc()){
echo $row['이름']."
";                          //이렇게 하면 '뉴스'의 하위 카테고리가 순환됩니다. 참고: 하위 카테고리만 제외하고 하위 카테고리만 순환합니다.
}
//여기서 작성하면 문제가 발견됩니다. 이 분류가 10단계 분류인 경우 각 하위 범주를 순환하려면 10개의 루프를 작성해야 합니까? 더 많은 분류 수준이 있다면 이렇게 쓰는 것은 분명히 비현실적입니다.
//그렇다면 해결책은 무엇입니까? 재귀 함수를 작성하고, f_id를 매개변수로 전달하고, 각 f_id 값을 계속 반복할 수 있습니다. 즉, 각 f_id 값의 하위 클래스를 반복할 수 있습니다.
//먼저 각 카테고리의 값을 2차원 배열로 저장하는데, 이는 다음 재귀 함수에서 유용합니다.
$result=$db->query("클래스에서 * 선택")
while($row=$result->fetch_assoc()){
$arr[]=array($row[id],$row[f_id],$row[name]); //각 행에는 카테고리의 id, f_id, 이름 정보가 저장됩니다.
}
function fenlei($f_id=0){ //$f_id는 0으로 초기화됩니다. 즉, 최대 분류부터 순환이 시작됩니다.
Global $arr; //$arr을 함수에서 참조하기 전에 전역 변수로 선언합니다.
for($i=0;$i If($arr[$i][1]==$f_id){ //$arr[$i][1]은 $i번째 카테고리의 f_id 값을 나타냅니다. $f_id=0으로 시작합니다. 즉, f_id=0이라는 분류를 출력합니다.
                                          echo $arr[$i][2]."
"; //$arr[$i][1]은 $i번째 카테고리의 이름 값을 나타냅니다.
               fenlei($arr[$i][0]); //$arr[$i][1]은 $i번째 카테고리의 id 값을 나타냅니다. 재귀를 수행합니다. 즉, 자신의 ID를 f_id 매개변수로 사용하여 자신의 서브클래스를 재활용합니다.
}
}
}
?>
id, parentid, name, 세 가지 필드 알고리즘도 매우 간단하고 재귀적입니다. 과거에는 재귀를 사용할 때 매우 어리석었습니다. 재귀에서는 모든 하위 클래스가 데이터 테이블을 쿼리하여 얻어졌기 때문입니다. . 최근에 저는 지구상의 모든 사람들이 생각할 수 있는 방법이라는 아이디어와 생각을 하게 되었습니다. 코드는 다음과 같습니다. 클래스는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
클래스 트리 {
 
 /**
* 모든 기밀 정보는 데이터베이스에서 쿼리됩니다
* @var 배열
​*/
 var $arr;
/**
* 다음 형식
* var $arr = 배열(
1 => array('id'=>'1','parentid'=>0,'name'=>'첫 번째 수준 열 1'),
2 => array('id'=>'2','parentid'=>0,'name'=>'첫 번째 수준 열 2'),
3 => array('id'=>'3','parentid'=>1,'name'=>'두 번째 수준 열 1'),
);*/
 
 /**
* 출력 구조
* @var 배열
​*/
 var $tree = 배열();
 /**
* 트리 재귀의 깊이
* @var int
​*/
 var $deep = 1;
 
 /**
* 나무 모양의 수정 기호 생성
* @var 배열
​*/
 var $icon = array('│','├','└');
 /**
* 지정된 ID를 사용하여 하위 트리 구조를 생성합니다
* @param int $rootid 트리 구조의 ID를 얻으려면
* @param string 재귀에 사용되는 $add 접두사
* @param bool $parent_end는 상위 카테고리가 마지막 카테고리인지 여부를 식별합니다
​*/
 함수 getTree($rootid = 0,$add = ”,$parent_end =true){
  $is_top = 1;
  $child_arr = $this->getChild($rootid);
  if(is_array($child_arr)){
   $cnt = 개수($child_arr);
   foreach($child_arr as $key => $child){
    $cid = $child['id'];
    $child_child = $this->getChild($cid);
    if($this->deep >1){
     if($is_top == 1 && $this->deep > 1){
      $space = $this->아이콘[1];
      if(!$parent_end)
      $add .=  $this->아이콘[0];
      else $add .= '  ';
     }
 
     if($is_top == $cnt){
      $space = $this->아이콘[2];
      $parent_end = 사실;
     }else {
      $space = $this->아이콘[1];
      $parent_end = 거짓;
     }
    }
    $this->tree[] = array('spacer'=>$add.$k.$space,
           '이름'=>$child['이름'],
           'id'=>$cid
    );
    $is_top ;
 
    $this->깊은 ;
    if($this->getChild($cid))
    $this->getTree($cid,$add,$parent_end);
    $이->깊은–;
   }
  }
  $this->tree를 반환합니다.
 }
 
 /**
* 하위 분류 배열 가져오기
* @param int $root
​*/
 함수 getChild($root = 0){
 
  $a = $child = 배열();
  foreach($this->arr as $id=>$a){
   if($a['parentid'] == $root){
    $child[$a['id']] = $a;
   }
  }
  $child?$child:false를 반환합니다.
 }
 /**
* 소스 배열 설정
* @param $arr
​*/
 함수 setArr($arr = array()){
  $this->arr = $arr;
 }
}
?>

일반적인 次查询把结构保存进一个数组, 再数组进行递归运算, 无疑极大的提高了程序运行效率, 使用代码很简单.

希望本文所述对大家程序设计有所帮助。

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