有这样一个表,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

不得不说:真是太优雅了!连我都佩服我自己了,同事更是五体投地,痛哭流涕。
因为他写了几十行循环再判断再递归的代码,被我用两行代码替换了……

20 条评论
余温重故 · 4月21日

我以为我遇到真理了 然而并没有 这么多年 这么多人 对于无限极的方法一直是递归 你在这个搞这样的 用风骚的标题 就想误人子弟?

+1 回复

偷影子的人 · 2016年03月10日

这个技巧挺好的

回复

王道中强流 作者 · 2016年03月10日

哈哈 谢谢 我也觉得

回复

Outshine · 2016年03月14日

最后得到一个id有啥用?还是说其实真正的代码是类似于你nodejs那个文章的方法,把所有id存到一个数组里?

回复

王道中强流 作者 · 2016年03月14日

额,比如一篇文章 保存了它的分类ID,就可以用这方法 获取顶级分类ID,无限级分类的话 应该还是会用到的。

回复

夏诺风 · 2016年03月15日

其实写一个递归也不是什么麻烦事儿

回复

commanne · 2016年03月15日

还真是一个好办法,一般分类不会经常有变动,这个数组也是容易维护的.

回复

王道中强流 作者 · 2016年03月16日

递归当然简单,但是性能不佳。

回复

bunching · 2016年03月20日

不错 学习了

回复

88888888888888888 · 2016年05月25日

..没看懂跟递归有什么区别
语义上不都是一直往上找么

回复

vertea · 2016年06月01日

66666666666666这个语句强啊实话

回复

chen_xiao_si · 2016年11月09日

you dont understood while()...?

回复

chen_xiao_si · 2016年11月09日

to 8888888888..

回复

ljnchn · 2016年11月23日

不如加个path字段呢,哈哈

回复

老黑 · 2016年12月08日

如果我要获取某一分类的所有子分类,该怎么做?

回复

韩韩 · 1月9日

处理结果,是不是还要遍历啊

回复

heahthqiu · 2月27日

学习,楼猪

回复

余温重故 · 4月21日

到底什么鬼 我并没看出来你这个有叼用 楼上的 你们学习了 学习什么了 我真的很好奇

回复

风君 · 6月6日

有个毛用

回复

我特么你哥 · 10月12日

我觉得这个不用递归也能实现吧。。。。。干嘛要说递归。一个foreach不就行了

回复

载入中...
王道中强流 王道中强流

1.5k 声望

发布于专栏

王道中强流

不为繁华易匠心

6 人关注