首页 php

thinkphp+mysql无线分类从需求到代码演示

发布于: 2020-06-28

  • 栏目无线分类
  • 无线分销(技术是无罪的,商业请使用三级分销)
  • 省市县联动

在我们做任何系统中离不开无线分类这个分类,同样也是老掉牙的问题。为什么又拿来说呢?归功到底还是博客的内容太少。

应用场景

  • 栏目无线分类
  • 无线分销(技术是无罪的,商业请使用三级分销)
  • 省市县联动

需求决定代码

无论你做任何系统都是有需求,你才去研究;没有需求,就是伪需求,自己玩玩就好。无论什么样的 需求都离不开sql和逻辑判断,下面的需求主要是围绕thinkphp+mysql来实现案例

表结构

字段类型NULL默认注释
idint(10)自增ID
parent_idint(10)0上级ID
namevarchar(50)名称
orderint(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

不难看出来 他们的上级是不同的,所有不是,所以我们要实现这个需求,就是通过路径来判断

实现步骤

  1. 先找到XB1的所有父类连接成字符串
  2. 然后找到XC1的所有父类连接成字符串
  3. 比较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 "在同一枝干上"
}