php实现网站留言板功能,Mysql无限分类的方法汇总
分类:web前端

自己要落实的就是下图的这种样式,可参看上边那多个网址的留言板,他们的兑现原理都以一模一样的

Infiniti分类是个老话题了,来探视PHP结合Mysql何以兑现。

本文实例陈诉了php+mysql查询实现Infiniti下级分类树输出。分享给我们供我们参谋,具体如下:

畅言留言板样式:

第一种艺术

此间介绍的php结合mysql查询Infiniti下级树输出,其实就是十二万分分类。给各位收拾了多少个phpInfiniti分类的例子.

图片 1

这种艺术是很何奇之有、很守旧的一种,先看表构造

function get_array{global $mysql,$_G; $sql = "select user_id as name from `{spreads_users}` where p1.spreads_userid='{$user_id}'";$rows= $mysql->db_fetch_arrays{ $arr[0]['name']=$user_id; $arr[0]['children']=array(); } $top=$top+1;foreach ($rows as $key=>$value) { $r = get_array; //调用函数,传入参数,继续查询下级 $arr[0]['children'][$key]['name']= $value['username']; //组合数组 if{ $arr[0]['children'][$key]['children']= $r[0]['children']; } $i++; } return $arr; }$list = get_array; //调用函数1000是顶级IDecho 'var data='.json_encode;

博客园跟帖样式:

表:category

本条是出口 Array 然后转让为 json

图片 2

id int 主键,自增

表结构:id字段为分类标记,name字段为分类名,father_id字段为所属父分类的id,path字段为分类路线,储存该分类祖先的集聚,isdir判定是或不是是目录,1为是,0为否.

原理
须求在评价表加多五个关键字段 id 和 pid  ,其余字段随便加多,比方小说id、回复时间、回复内容、回复人什么的。
内部pid正是时下曾经还原过的褒贬的id。
从上海体育场合能够见到,里面每一层的pid便是正是他上一层舆情的id。留神察看下方面包车型客车布局。是否很像PHP中的多维数组?即使您能体会领会,那么就大致了。
落到实处形式
**
1.前台:那些比较简单便是div嵌div。然后设置div的border和margin  padding就能够了
**

name varchar 分类名称

来得函数:

<div class="comment"> 
 <div class="comment"> 
  <div class="comment"> 
 
  </div> 
 </div> 
</div> 
 
<div class="comment"> 
 
</div>

pid int 父类id,默认0

//$count为分类等级sort_list($str,$fatherid,$count){$rs = $this->sql->re_datas("select * from sort where father_id = fatherid");$num = $this->sql->sql_numrows();$i=0;$n = 1;while{$name = "";for($n = 1 ; $n < $count ; $n ){$name.="│ ";}if{$name.="└─".$rs[$i][name];}else{$name.="├─".$rs[$i][name];}if{$str.="".$name."";}else{$str.=$name";}$temp = $count 1;$str = $this->sort_list($str,$rs[$i][id],$temp);$i ;}return $str;}

2、后台 :用到了一次递归,首先用递归把数据库中的结果重新整合下,重新组合之后,然后用递归输出上边的这种前台代码就可以 comment表结商谈内容如下

五星级分类的 pid 默许正是0了。当大家想抽取有些分类的子分类树的时候,基本思路就是递归,当然,出于功能难点不提出每趟递归都查询数据库,日常的做法是先将持有分类抽取来,保存到PHP数组里,再张开始拍片卖,最终还能将结果缓存起来以增进后一次呼吁的成效。

内部$this->sql对象为sql操作类对象,re_datas(State of Qatar函数再次来到查到的数组,sql_numrows(卡塔尔(قطر‎函数再次回到查询到的数目.

图片 3

先来塑造多少个原始数组,这些平素从数据库中拉出来就能够:

$sort_list = sort_list;

下一场径直读出那些表中的享有评价。可以赢得如下数组

代码如下:

id int 主键,自增name varchar 分类名称pid int 父类id,私下认可0

Array 
( 
 [0] => Array 
  ( 
   [id] => 1 
   [pid] => 
   [content] => 评论1 
  ) 
 
 [1] => Array 
  ( 
   [id] => 2 
   [pid] => 
   [content] => 评论2 
  ) 
 
 [2] => Array 
  ( 
   [id] => 3 
   [pid] => 
   [content] => 评论3 
  ) 
 
 [3] => Array 
  ( 
   [id] => 4 
   [pid] => 1 
   [content] => 评论4回复评论1 
  ) 
 
 [4] => Array 
  ( 
   [id] => 5 
   [pid] => 1 
   [content] => 评论5回复评论1 
  ) 
 
 [5] => Array 
  ( 
   [id] => 6 
   [pid] => 2 
   [content] => 评论6回复评论2 
  ) 
 
 [6] => Array 
  ( 
   [id] => 7 
   [pid] => 4 
   [content] => 评论7回复评论4 
  ) 
 
 [7] => Array 
  ( 
   [id] => 8 
   [pid] => 7 
   [content] => 评论8回复评论7 
  ) 
 
 [8] => Array 
  ( 
   [id] => 9 
   [pid] => 8 
   [content] => 评论9回复评论8 
  ) 
 
 [9] => Array 
  ( 
   [id] => 10 
   [pid] => 8 
   [content] => 评论10回复评论8 
  ) 
 
)

$categories = array(

一流分类的 pid 暗中认可正是0了,当我们想抽出有些分类的子分类树的时候,基本思路正是递归,当然,出于功效难点不建议每一趟递归都查询数据库,常常的做法是先讲全部分类抽取来,保存到PHP数组里,再扩充拍卖,最终还能将结果缓存起来以增长下一次哀求的功用.先来创设二个原始数组,这些平昔从数据库中拉出来就能够:

下一场大家就需求把这几个数组重新组合成上边的这种留言板情势的
里头$array正是上面读抽取来的数组,首先抽取pid默感到空的,然后递归,在抽出pid为最近评价id的数组

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),
$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),);
public static function tree($array,$child="child", $pid = null) 
{ 
 $temp = []; 
 foreach ($array as $v) { 
  if ($v['pid'] == $pid) { 
   $v[$child] = self::tree($array,$child,$v['id']); 
   $temp[] = $v; 
  } 
 } 
 return $temp; 
}

);

对象是将它转载为上面这种组织:

整合后,可以获得上边包车型大巴这一个数组,能够见见,这几个数组的体制已经和前台斟酌样式很像了

对象是将它转变为下边这种构造

电脑—笔记本——-超级本——-游戏本—台式机手机—智能机—功能机
Array 
( 
 [0] => Array 
  ( 
   [id] => 1 
   [pid] => 
   [content] => 评论1 
   [child] => Array 
    ( 
     [0] => Array 
      ( 
       [id] => 4 
       [pid] => 1 
       [content] => 评论4回复评论1 
       [child] => Array 
        ( 
         [0] => Array 
          ( 
           [id] => 7 
           [pid] => 4 
           [content] => 评论7回复评论4 
           [child] => Array 
            ( 
             [0] => Array 
              ( 
               [id] => 8 
               [pid] => 7 
               [content] => 评论8回复评论7 
               [child] => Array 
                ( 
                 [0] => Array 
                  ( 
                   [id] => 9 
                   [pid] => 8 
                   [content] => 评论9回复评论8 
                   [child] => Array 
                    ( 
                    ) 
 
                  ) 
 
                 [1] => Array 
                  ( 
                   [id] => 10 
                   [pid] => 8 
                   [content] => 评论10回复评论8 
                   [child] => Array 
                    ( 
                    ) 
 
                  ) 
 
                ) 
 
              ) 
 
            ) 
 
          ) 
 
        ) 
 
      ) 
 
     [1] => Array 
      ( 
       [id] => 5 
       [pid] => 1 
       [content] => 评论5回复评论1 
       [child] => Array 
        ( 
        ) 
 
      ) 
 
    ) 
 
  ) 
 
 [1] => Array 
  ( 
   [id] => 2 
   [pid] => 
   [content] => 评论2 
   [child] => Array 
    ( 
     [0] => Array 
      ( 
       [id] => 6 
       [pid] => 2 
       [content] => 评论6回复评论2 
       [child] => Array 
        ( 
        ) 
 
      ) 
 
    ) 
 
  ) 
 
 [2] => Array 
  ( 
   [id] => 3 
   [pid] => 
   [content] => 评论3 
   [child] => Array 
    ( 
    ) 
 
  ) 
 
)

电脑

用数组来表示的话,能够扩大二个 children 键来囤积它的子分类:

赢得地方的数组后 ,再用递归输出就可以

笔记本

    超级本

    游戏本

台式机
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, //其他分类省略)
public static function traverseArray($array) 
{ 
 foreach ($array as $v) { 
  echo "<div class='comment' style='width: 100%;margin: 10px;background: #EDEFF0;padding: 20px 10px;border: 1px solid #777;'>"; 
  echo $v['content']; 
  if ($v['child']) { 
   self::traverseArray($v['child']); 
  } 
  echo "</div>"; 
 
 } 
 
}

手机

管理进程:

接下来就能够看出

智能机

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

图片 4

用数组来表示的话,能够扩大多个 children 键来存款和储蓄它的子分类:

print_r;打字与印刷结果如下:

规律就是那样,正是重新整合下数组,然后遍历输出就能够了。

代码如下:

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达成畅言留言板和今日头条跟帖样式的全体历程,大家也足以尝尝举行更新,希望那篇作品对大家的求学抱有利于。

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(

                //此处省略

            )

        ),

    )

),

//其他分类省略

缺点:使用PHP管理,借使分类数量小幅度,作用也会收缩.

)

越来越多关于PHP相关内容感兴趣的读者可查阅本站专项论题:《php+mysql数据库操作入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总计》、《php面向对象程序设计入门教程》、《PHP网络编制程序技艺总计》、《PHP数组操作本事大全》、《php字符串用法总括》及《php习感到常数据库操作技术汇总》

管理进度:

瞩望本文所述对大家PHP程序设计有所援助。

代码如下:

$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);

打字与印刷结果如下:

代码如下:

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管理,假诺分类数量宏大,功能也会骤降。

第三种方法

这种格局是在表字段中加进三个path字段:

表:category

id int 主键,自增

name varchar 分类名称

pid int 父类id,默认0

path varchar 路径

示范数据:

id name pid path

1 电脑 0 0

2 手机 0 0

3 笔记本 1 0-1

4 超级本 3 0-1-3

5 游戏本 3 0-1-3

path字段记录了从根分类到上拔尖父类的路线,用id+'-'表示。

这种情势,如若大家要询问Computer下的保有后代分类,只必要一条sql语句:

select id,name,path from category where path like (select concat(path,'-',id,'%') as path from category where id=1);

结果:

+----+-----------+-------+

| id | name | path |

+----+-----------+-------+

| 3 | 笔记本 | 0-1 |

| 4 | 超级本 | 0-1-3 |

| 5 | 游戏本 | 0-1-3 |

+----+-----------+-------+

这种方式也被不菲人所选拔,小编总计了下:

亮点:查询轻巧,功效高,path字段能够加索引。

症结:更新节点关系麻烦,要求更新具备后辈的path字段。

以上正是本文的全体内容了,两种方法,你爱怜哪个种类?希望大家能够赏识。

本文由10bet手机官网发布于web前端,转载请注明出处:php实现网站留言板功能,Mysql无限分类的方法汇总

上一篇:两种php去除二维数组的重复项方法,php删除数组中重复元素的方法_php技巧_脚本之家 下一篇:PHP扩展开发教程,函数传入数组
猜你喜欢
热门排行
精彩图文