无限分类的方法很多,现在比较流行的是使用父ID来实现,而使用父ID一般是使用递归来实现,以下我用两种方法来实现。
首先我们先建立以下数据表:(sort表)
先说明一下这个数据表的意义,id是唯一的,而pid就是父分类的id,name就是分类的名称。
我们首先约定一下,当pid为0的时候就是顶级分类,而不为0的时候就是子分类。
第一种实现方法:
第一种实现方法的思路是把pid为0的分类取出来,然后再以这些顶级分类的id作为父id来取得他们的子分类,然后再以他们的子分类id作为父id,如此一直循环下去,直到把所有的分类都取完。代码如下:
上面的代码我们使用了递归的方法来实现,不过当我们运行的时候会发现分类没有分层,全部都是在一个层次,一点都不美观,所以我们可以添加一个级别给他,怎么做呢?
这样修改之后我们会发现分类分层了。
第二种实现方法:
我们发现在第一种方法中,每次取得一个分类都要查询一次数据库,如果分类多的话(好似淘宝那样)速度是非常不乐观的,那我们怎么来重构他呢?
我们可以先一次把所有的分类都取出来,然后再用PHP去处理他。而原理跟第一种方法差不多,都是根据pid去获得子分类。实现方法如下:
好了,现在只查询一次数据库就可以实现第一种方法了。
首先我们先建立以下数据表:(sort表)
id pid name
int(主键) int varchar
int(主键) int varchar
先说明一下这个数据表的意义,id是唯一的,而pid就是父分类的id,name就是分类的名称。
我们首先约定一下,当pid为0的时候就是顶级分类,而不为0的时候就是子分类。
第一种实现方法:
第一种实现方法的思路是把pid为0的分类取出来,然后再以这些顶级分类的id作为父id来取得他们的子分类,然后再以他们的子分类id作为父id,如此一直循环下去,直到把所有的分类都取完。代码如下:
<?php
$conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库
function get_sort_list($pid) {
global $conn;
$sql = “SELECT * FROM sort WHERE pid=‘0’”;
$query = mysql_query($sql, $conn);
While ($row = mysql_fetch_array($query)) {
echo $row[‘name’];
get_sort_list($row[‘id’]);
}
}
get_sort_list(0);//以pid为0作为开始
?>
$conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库
function get_sort_list($pid) {
global $conn;
$sql = “SELECT * FROM sort WHERE pid=‘0’”;
$query = mysql_query($sql, $conn);
While ($row = mysql_fetch_array($query)) {
echo $row[‘name’];
get_sort_list($row[‘id’]);
}
}
get_sort_list(0);//以pid为0作为开始
?>
上面的代码我们使用了递归的方法来实现,不过当我们运行的时候会发现分类没有分层,全部都是在一个层次,一点都不美观,所以我们可以添加一个级别给他,怎么做呢?
<?php
$conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库
function get_sort_list($pid, $leven) {
global $conn;
$sql = “SELECT * FROM sort WHERE pid=‘0’”;
$query = mysql_query($sql, $conn);
While ($row = mysql_fetch_array($query)) {
for ($i = 0; $i < $leven; $i++) {
echo ‘ ’;
}
echo $row[‘name’];
get_sort_list($row[‘id’], $leven + 1);
}
}
get_sort_list(0, 0);//以pid为0, leven为0作为开始调用函数
?>
$conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库
function get_sort_list($pid, $leven) {
global $conn;
$sql = “SELECT * FROM sort WHERE pid=‘0’”;
$query = mysql_query($sql, $conn);
While ($row = mysql_fetch_array($query)) {
for ($i = 0; $i < $leven; $i++) {
echo ‘ ’;
}
echo $row[‘name’];
get_sort_list($row[‘id’], $leven + 1);
}
}
get_sort_list(0, 0);//以pid为0, leven为0作为开始调用函数
?>
这样修改之后我们会发现分类分层了。
第二种实现方法:
我们发现在第一种方法中,每次取得一个分类都要查询一次数据库,如果分类多的话(好似淘宝那样)速度是非常不乐观的,那我们怎么来重构他呢?
我们可以先一次把所有的分类都取出来,然后再用PHP去处理他。而原理跟第一种方法差不多,都是根据pid去获得子分类。实现方法如下:
<?php
$conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库
$query = mysql_query(“SELECT * FROM sort”);
$sorts = array();
//取出所有分类
While($row = mysql_fetch_array($query)) {
$sorts[] = $row;
}
function get_sort_list($pid, $leven) {
global $sorts;
foreach ($sorts as $sort) {
if ($sort[‘pid’] == $pid) {//如果当前分类的pid等于要获取的pid
for ($i = 0; $i < $leven; $i++) echo ‘ ’;
echo $sort[‘name’];
get_sort_list($sort[‘id’], $leven + 1);
}
}
}
get_sort_list(0, 0);//以pid为0, leven为0作为开始调用函数
?>
$conn = mysql_connect(‘localhost’, ‘root’, ‘123456’);//连接数据库
$query = mysql_query(“SELECT * FROM sort”);
$sorts = array();
//取出所有分类
While($row = mysql_fetch_array($query)) {
$sorts[] = $row;
}
function get_sort_list($pid, $leven) {
global $sorts;
foreach ($sorts as $sort) {
if ($sort[‘pid’] == $pid) {//如果当前分类的pid等于要获取的pid
for ($i = 0; $i < $leven; $i++) echo ‘ ’;
echo $sort[‘name’];
get_sort_list($sort[‘id’], $leven + 1);
}
}
}
get_sort_list(0, 0);//以pid为0, leven为0作为开始调用函数
?>
好了,现在只查询一次数据库就可以实现第一种方法了。
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/3073/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
评论列表