栏目无线分类 无线分销(技术是无罪的,商业请使用三级分销) 省市县联动 在我们做任何系统中离不开无线分类这个分类,同样也是老掉牙的问题。为什么又拿来说呢?归功到底还是博客的内容太少。
应用场景 栏目无线分类 无线分销(技术是无罪的,商业请使用三级分销) 省市县联动 需求决定代码 无论你做任何系统都是有需求,你才去研究;没有需求,就是伪需求,自己玩玩就好。无论什么样的 需求都离不开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 "在同一枝干上" }