栏目无线分类 无线分销(技术是无罪的,商业请使用三级分销) 省市县联动 在我们做任何系统中离不开无线分类这个分类,同样也是老掉牙的问题。为什么又拿来说呢?归功到底还是博客的内容太少。
应用场景 栏目无线分类 无线分销(技术是无罪的,商业请使用三级分销) 省市县联动 需求决定代码 无论你做任何系统都是有需求,你才去研究;没有需求,就是伪需求,自己玩玩就好。无论什么样的 需求都离不开sql和逻辑判断,下面的需求主要是围绕thinkphp+mysql来实现案例
表结构 字段 类型 NULL 默认 注释 id int(10) 否 自增ID parent_id int(10) 否 0 上级ID name varchar(50) 否 名称 order int(10) 否 0 排序
根据子类ID
获取所有父类 1 2 3 4 5 6 7 8 function get_user_father_array($uid,$array=[]){ $user = \think\Db::name('users')->where('id',$uid)->find(); $array[] = $user; if($user['parent_id']){ return get_user_father_array($user['parent_id'],$array); } return $array; }
根据父类查所有子类 1 2 3 4 5 6 7 // sql 获取子类数据 function get_child_user_sql($uid){ $sql = "SELECT * FROM ". "(SELECT id,parent_id FROM users ORDER BY parent_id,id) as t,(SELECT @pv := {$uid}) as pv ". "WHERE find_in_set(parent_id, @pv) AND LENGTH(@pv := concat(@pv, ',', id))"; return \think\Db::query($sql); }
点对点是否在一个枝干上 XYZ的上级为0,也就是说是顶级树干
X 推荐了 B 和 C
B 推荐XB1、XB2、XB3、…..XBn
C 推荐XC1、XC2、XC3、……XCn
问: XB1和XC1 和是否在一枝干上
答:某个项目告诉我不是,为什么?
XB1的分枝干包含 X、B
XC1的分枝干包含 X、C
不难看出来 他们的上级是不同的,所有不是,所以我们要实现这个需求,就是通过路径来判断
实现步骤
先找到XB1的所有父类连接成字符串 然后找到XC1的所有父类连接成字符串 比较2个字符串是否包含或被包含 代码实现一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 $left = array_column(get_user_father_array($left_uid),'id'); $leftstr = implode(",",$left); $right = array_column(get_user_father_array(right_uid),'id'); $rightstr = implode(",",$right); function str2strpos($str1 ,$str2){ $str1len = strlen($str1); $str2len = strlen($str2); if($str1len > $str2len && strpos($str1,$str2) !== false){ return true; } if($str1len < $str2len && strpos($str2,$str1) !== false){ return true; } return false; } if(str2strpos($leftstr,$rightstr)){ echo "在同一枝干上" }