天天看點

PHP利用遞歸實作無極限分類

所謂的無極限分類就是一個類可以分成多個子類,然後一個子類又可以分出另外多個子類。

在日常的工作中很多地方都需要用到無極限分類,如評論,網站版塊,省市清單等等,下面通過一個簡單的例子來實作無極限分類:

首先建立一個資料庫:

CREATE TABLE IF NOT EXISTS `category` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `pid` int(10),

  `name` varchar(50),

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

pid 表示父類id;

然後插入一些資料:

INSERT INTO `category`(`id`,`pid`,`name`) VALUES(1,'0','北京'),(2,'1','豐台區'),(3,'1','朝陽區'),(4,'1','通州區'),(5,'1','大興區'),(6,'1','昌平區'),(7,'1','房山區'),(8,'0','湖南省'),(9,'8','常德市'),(10,'8','長沙市'),(11,'9','武陵區'),(12,'10','雨花區'),(13,'9','石門縣'),(14,'9','鼎城區'),(15,'10','望城縣'),(16,'0','河南省'),(17,'16','高新區'),(18,'16','中原區'),(19,'17','蓮花街')(20,'18','中原大道'),(21,'16','鄭大新區');

通過遞歸的方式實作無極限分類:

<?php

$link=mysql_connect('localhost','root','123456');

if(!$link){

    die("連接配接失敗:".mysql_error());

}

mysql_select_db('test') or die("不能連接配接資料庫".mysql_error());

$sql="select * from category";

$query=mysql_query($sql);

if($query){

    while(list($id,$pid,$name)=mysql_fetch_row($query)){

        static $i=0;

        $i++;

        $arr[$i]['id']=$id;

        $arr[$i]['pid']=$pid;

        $arr[$i]['name']=$name;

    }

}

function GetTree($arr,$pid,$step){

    global $tree;

    foreach($arr as $key=>$val) {

        if($val['pid'] == $pid) {

            $flg = str_repeat('└―',$step);

            $val['name'] = $flg.$val['name'];

            $tree[] = $val;

            GetTree($arr , $val['id'] ,$step+1);

        }

    }

    return $tree;

}

$newarr=GetTree($arr,0,0);

foreach($newarr as $value){

    echo $value['name'].'<br>';

}

?>

效果如圖:

PHP利用遞歸實作無極限分類
PHP利用遞歸實作無極限分類