tp6无限极分类的查询(递归)

简介: tp6无限极分类的查询(递归)
$cats = Db::name('cat')->select()->toArray();
        $cats = tree($cats);

在这里插入图片描述

function tree($data,$pid=0,$level=0){

        static $arr = [];
        foreach($data as $k=>$v){
            if($v['pid']==$pid){
                $v['cat_name'] = str_repeat('|----',$level).$v['cat_name'];
                $arr[] = $v;
                unset($data[$k]);
                tree($data,$v['id'],$level+1);
            }
        }
        return $arr;
        
    }

递归就是先查找顶级分类,然后通过递归查找其顶级分类下的子类。
如果有第二个顶级分类的话,他会先unset($data[$k])先删除已经遍历过的,就能得到第二个顶级分类

$v['cat_name'] = str_repeat('|----',$level).$v['cat_name'];

是先判断是顶级分类就不用|----,不是的话,下一级分类就开始加|----了,在下一级的话,就|----|----

if($v['pid']==$pid){

的意思是看$v['pid']是不是等于0.代表顶级分类啊

tree($data,$v['id'],$level+1);

查找顶级分类其下的子类(递归)$level+1,代表顶级分类的下一级

static $arr = [];

为什么静态,因为不会覆盖嘛

$arr[] = $v;

找到了就放到数组里面。比较方便一点。比较一个数组进来进行递归操作比较麻烦

-- phpMyAdmin SQL Dump
-- version 4.8.5
-- https://www.phpmyadmin.net/
--
-- 主机: localhost
-- 生成日期: 2022-05-23 18:02:43
-- 服务器版本: 5.7.26
-- PHP 版本: 7.3.4

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- 数据库: `kkk`
--

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

--
-- 表的结构 `cat`
--

CREATE TABLE `cat` (
  `id` int(10) UNSIGNED NOT NULL,
  `pid` int(10) UNSIGNED NOT NULL,
  `cat_name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `cat_img` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `is_show` tinyint(4) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- 转存表中的数据 `cat`
--

INSERT INTO `cat` (`id`, `pid`, `cat_name`, `cat_img`, `is_show`) VALUES
(1, 0, '手机', '/storage/category/bc\\91231321a92a7a6a6db99fa7db8f37.png', 1),
(7, 0, '厨具', '/storage/category/01\\c7232eb931fa3dd40f8b4946bd27fa.jpg', 1),
(8, 7, '电饭锅', '/storage/category/2b\\edd18255c4efcfc4a9982ce33671be.jpg', 1),
(9, 0, '服装', '/storage/category/f6\\655e2bed6b7bea027fb69a3c11a27c.jpg', 1),
(10, 9, '女装', '/storage/category/84\\f9e13fa3a6093990bf3de4e2da74a0.jpg', 1),
(11, 1, '华为', '/storage/category/b4\\a403d9874ed426bd5210a2f42c33f0.jpg', 1);

--
-- 转储表的索引
--

--
-- 表的索引 `cat`
--
ALTER TABLE `cat`
  ADD PRIMARY KEY (`id`);

--
-- 在导出的表使用AUTO_INCREMENT
--

--
-- 使用表AUTO_INCREMENT `cat`
--
ALTER TABLE `cat`
  MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
相关文章
|
SQL 关系型数据库 MySQL
MySql 别犯糊涂了! LEFT JOIN 的 ON 后接上筛选条件,多个条件会出事!
MySql 别犯糊涂了! LEFT JOIN 的 ON 后接上筛选条件,多个条件会出事!
1823 0
MySql 别犯糊涂了! LEFT JOIN 的 ON 后接上筛选条件,多个条件会出事!
|
9月前
|
PHP 数据库
tp5查询指定字段
tp5查询指定字段
【TP5.1】根据时间条件的查询
【TP5.1】根据时间条件的查询
147 0
tp5模型怎么进行删除
tp5模型怎么进行删除
80 0
【TP5】查询返回结果
【TP5】查询返回结果
136 0
【TP5】查询返回结果
【TP5.1】关于使用时间条件查询
【TP5.1】关于使用时间条件查询
113 0
|
SQL
【TP5.1】whereOr的用法(双条件查询)
【TP5.1】whereOr的用法(双条件查询)
467 0
【TP5.1】whereOr的用法(双条件查询)