您的位置:首页 > 编程语言 > PHP开发

PHP无限极分类,多种方法|很简单,这里说的很详细,其它地方说的很不好懂

2016-12-28 15:14 531 查看
当你学习php无限极分类的时候,大家都觉得一个字“难”我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究。

到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱,代码很多,让我们怎么学习嘛,那些都不靠谱,还是自己捣鼓捣鼓无限极分类了。

比如一个category表:有id, name, pid, sort 就这四个简单的字段,不要太复杂了。

id name pid sort
1 PHP 0 1
2 Javascript 0 2
3 MySQL 0 3
4 PHP类 1 1
5 smarty 1 2
6 私有方法 4 1
7 jQuery 2 1

代码:category.class.php

class Category {
static public function sortOut($cate,$pid=0,$level=0,$html='--'){
$tree = array();
foreach($cate as $v){
if($v['id'] == $pid){
$v['level'] = $level + 1;
$v['html'] = str_repeat($html, $level);
$tree[] = $v;
$tree = array_merge($tree, self::sortOut($cate,$v['id'],$level+1,$html));
}
}
return $tree;
}
}

这里的$cate是查询上面表获取的一个二维数组:这里就不写了

下面是效果:

id name pid level sort
1 PHP 0 1 1
4 --php类 1 2 1
6 ----私有方法 4 3 1
5 --smarty 1 2 2
2 Javascript 0 1 2
7 --php类 2 2 1
3 MySQL 0 1 3

到此,我们就实现了最简单的php无限极分类了,这个在工作中用的很多的。

----------------------------------------------

好像不需要array_merge

function tree(&$list,$pid=0,$level=0,$html='--'){
static $tree = array();
foreach($list as $v){
if($v['pid'] == $pid){
$v['sort'] = $level;
$v['html'] = str_repeat($html,$level);
$tree[] = $v;
tree($list,$v['id'],$level+1);
}
}
return $tree;
}

大家知道分类多了,递归效率也就低了,所以,有了下面的算法:预排序遍历树算法进行无限分类


相关文章推荐:

超优雅!两行代码搞定 php 无限级分类 获取顶级分类ID

有这样一个表,
id
是分类的ID,
name
是分类名称,
pid
是上级分类的ID。



现在有个分类ID,程序要找到它上级的上级的上级……分类的ID,简单说就是找出顶级分类的ID。比如“新鲜水果”的ID是13,对应父类ID是5,而5的父ID是1,1没有父类,也就是顶级分类了。

以前年轻气盛不懂事,总想着用递归来查找,然后再将结果缓存来解决性能问题。
后来又试过将整个表缓存起来,再递归查找。
再后来……似乎比较少有机会遇到无限级分类……

最近有个同事问我怎么“优雅”的解决这个问题。于是我灵机一动,就有了如下解决方案:

<?php
$sql = "select id, pid from tablename ";
// 查询后 将结果处理成 如下数组格式
$arr = [
// id => pid
1 => 0,
// 省略...
5 => 1,
// 省略...
13 => 5
];
// 建议将这数组缓存起来

$id = 13;
while($arr[$id]) {
$id = $arr[$id];
}
echo $id; // 1


不得不说:真是太优雅了!连我都佩服我自己了,同事更是五体投地,痛哭流涕。因为他写了几十行循环再判断再递归的代码,被我用两行代码替换了……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: