首頁 > 後端開發 > php教程 > php如何实现无限级分类?

php如何实现无限级分类?

PHPz
發布: 2020-09-04 14:12:03
原創
3791 人瀏覽過

在php中,可以利用递归算法并结合mysql数据表来实现无限级分类。下面本篇文章给大家介绍一下实现方法,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

php如何实现无限级分类?

什么是无限级分类?

无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了。其实我们仔细想一下,生活中的分类简直太多了,衣服可以分为男装和女装,也可以分为上衣和裤子,也可以根据年龄段分类。分类无处不在,分类显得“无限”。我这里就不说无限分类的必要性了。

无限级分类原理简介

无限分类看似"高大上",实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。

闲话不多说,该展现本文的实例了。

作为一个狂热海贼迷,这篇的实例我就以《海贼王》人物组织做案例。

数据库准备: 

建表onepiece:

1

2

3

4

5

6

create table onepiece(

    id int auto_increment,

    pid int not null,

    name varchar(225) not null,

    primary key(id)

);

登入後複製

插入测试数据:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

insert onepiece values

    (1,0,'海军'),

    (2,0,'海贼'),

    (3,0,'革命军'),

    (4,1,'青雉'),

    (5,1,'赤犬'),

    (6,1,'黄猿'),

    (7,2,'四皇'),

    (8,2,'七武海'),

    (9,2,'草帽海贼团'),

    (10,9,'索隆'),

    (11,7,'香克斯'),

    (12,8,'多弗朗明哥'),

    (13,8,'克洛克达尔');

登入後複製

这里还是科普下海贼王里面的设定:世界分为三大阵营:海军,海贼,革命军。海军有大将:青雉,赤犬,黄猿。海贼有:四皇,七武海,草帽海贼团。四皇有香克斯,七武海有多弗朗明哥,克洛克达尔,草帽海贼团有索隆。(打个广告:海贼王真的很好看)。

最终目的:

我们今天制作的是两种形式的无限级分类形式,一种是下拉列表式,一种则是导航Link式的。直接上效果图了:

下拉列表式

1.png

导航Link式

2.png

实例代码:

我封装了一个Unlimited类,用来调用diaplayList()展现下拉列表形式,调用diaplayLink展现导航Link分类。也可以增加(addNodes())和删除(deleteNodes)分类。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

<?php

 

class Unlimited{

    protected $mysqli;

    public function __construct($config){

        $this->mysqli=new mysqli($config[&#39;host&#39;],$config[&#39;user&#39;],$config[&#39;pwd&#39;]);

        $this->mysqli->select_db($config[&#39;db&#39;]);

        $this->mysqli->set_charset(&#39;utf8&#39;);

        if ($this->mysqli->connect_errno) {

            echo $this->mysqli->connect_error;

        }

    }   

 

    private function getList($pid=0,&$result=array(),$spac=0){

        $spac=$spac+2;

        $sql="select * from onepiece where pid={$pid}";

        $rs=$this->mysqli->query($sql);

        while($row=$rs->fetch_assoc()) {

            $row[&#39;name&#39;]=str_repeat(&#39; &nbsp&#39;,$spac).$row[&#39;name&#39;];

            $result[]=$row;

            $this->getList($row[&#39;id&#39;],$result,$spac);           

        }

        return $result;

    }

    /**

     * 展现下拉列表式分类

     * @return [type]

     */

    public function displayList(){

        $rs=$this->getList();

        $str="<select name=&#39;cate&#39;>";

 

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

            $str.="<option >{$val[&#39;name&#39;]}</option>";

        }

        $str.="</select>";

        return $str;

    }

 

    private function getLink($cid,&$result=array()){

        $sql="select * from onepiece where id={$cid}";

        $rs=$this->mysqli->query($sql);

        if($row=$rs->fetch_assoc()){

            $result[]=$row;

            $this->getLink($row[&#39;pid&#39;],$result);

        }

        return array_reverse($result);

    }

    /**

     * 展现导航Link

     * @param  [type] $cid [description]

     * @return [type]      [description]

     */

    public function displayLink($cid){

        $rs=$this->getLink($cid);

        $str=&#39;&#39;;

        foreach ($rs as $val) {

            $str.="<a href=&#39;&#39;>{$val[&#39;name&#39;]}</a>>";

        }

 

        return $str;

    }

    /**

     * 增加分类

     * @param [type] $pid  父类id

     * @param [type] $name 本类名

     */

    public function addNodes($pid,$name){

        $sql="insert into onepiece values(&#39;&#39;,{$pid},&#39;".$name."&#39;)";

        if($this->mysqli->query($sql)){

 

            return true;

 

        }

    }

    /**

     * 删除分类

     * @param  [type] $id 本类id

     * @return [type]    

     */

    public function deleteNodes($id){

        $sql="select * from onepiece where pid ={$id}";

        $rs=$this->mysqli->query($sql);

        if($row=$rs->fetch_assoc()){

            $mes="还有子元素,请勿删除";

        }else{

            $sql="delete from onepiece where id={$id}";

            if($this->mysqli->query($sql)){

                $mes="删除成功";

            }

        }

        return $mes;

    }

}

登入後複製

类中函数主要采取了递归函数的方法,如果理解深刻理解递归函数,其余的部分也就水到渠成了。后面的php递归函数的三种方法详细介绍了php递归函数的原理。

更多相关知识,请访问 PHP中文网!!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
怎麼學好php
來自於 1970-01-01 08:00:00
0
0
0
PHP擴充intl
來自於 1970-01-01 08:00:00
0
0
0
php數據獲取?
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板