mysql和php无限分类 数据归类 输出

本文介绍如何利用PHP(基于TP5框架)配合MySQL进行无限级分类数据的整理与输出。通过设置pid(子级)等于id(父级),在循环中寻找并插入父级分类,递归过程中注意标志位flag的调整,确保分类层次清晰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明在先:数据整合部分参考了网上博客;但是数据输出是自己写的,使用了递归;

数据归类解释:利用pid(子级)=id(父级);让子级循环的时自己去找父级在哪儿,然后加入其中;

递归:里面需要注意,flag(|–)的问题,下一个父级兄弟要少一个flag(|–)

数据表结构:

CREATE TABLE `NewTable` (
`id`  int(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
`pid`  int(10) UNSIGNED NOT NULL ,
`name`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' ,
PRIMARY KEY (`id`),
INDEX `pid` (`pid`) USING BTREE 
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=latin1 COLLATE=latin1_swedish_ci
AUTO_INCREMENT=1
ROW_FORMAT=COMPACT;

源数据

INSERT INTO `test1` VALUES (1, 0, 'menu1');
INSERT INTO `test1` VALUES (2, 0, 'menu2');
INSERT INTO `test1` VALUES (3, 0, 'menu3');
INSERT INTO `test1` VALUES (4, 0, 'menu4');
INSERT INTO `test1` VALUES (5, 0, 'menu5');
INSERT INTO `test1` VALUES (6, 0, 'menu6');
INSERT INTO `test1` VALUES (7, 1, 'menu1-1');
INSERT INTO `test1` VALUES (8, 1, 'menu1-2');
INSERT INTO `test1` VALUES (9, 1, 'menu1-3');
INSERT INTO `test1` VALUES (10, 7, 'menu7-1');
INSERT INTO `test1` VALUES (11, 7, 'menu7-2');
INSERT INTO `test1` VALUES (12, 7, 'menu7-3');
INSERT INTO `test1` VALUES (13, 7, 'menu7-4');
INSERT INTO `test1` VALUES (14, 10, 'menu10-1');
INSERT INTO `test1` VALUES (15, 10, 'menu10-2');
INSERT INTO `test1` VALUES (16, 10, 'menu10-3');
INSERT INTO `test1` VALUES (17, 8, 'menu8-1');

php代码:基于TP5框架

<?php

namespace app\index\controller;

use app\index\model;
use think\Db;
use think\Debug;

class Index 
{
    public function index()
    {
    	$res = Db::table('test1')->select();
    	
    	//新数组:自身id当作key,以便下面操作
    	$tree = array();
    	foreach ($res as $key => $val) {
			$tree[$val['id']] = $val;
			$tree[$val['id']]['children'] = array();
	   	}

        //将有pid的元素,整合到对应的pid=id(这一步是最重要的)
	   	foreach ($tree as $key => $val) {
	   		if ($val['pid'] != 0) {
	   			$tree[$val['pid']]['children'][] = &$tree[$key];//$val['pid']=$key;等价于:pid=id
	   		}
	   	}

        //去除tree中有pid的元素,因为他们已经被归类了;
	   	foreach ($tree as $key => $val) {
	   		if ($val['pid']==0) continue; 
   			unset($tree[$key]);
	   	}

	   	$temp = array();
	   	$grup = '';
	   	$flag = '|--';


	   	$this->recursive($tree,$temp,$grup,$flag);
	   	var_dump($temp);exit;

    }

    public function recursive($data,&$temp,&$division,$flag)
    {
    	$diviT = $division;
	   	if(reset($data)['pid']!=0) $division .= $flag;

	   	foreach ($data as $key => $val) {
			$temp[] = $division.$val['name'];
	   		if (is_array($val['children'])) {
	   			$this->recursive($val['children'],$temp,$division,$flag);
	   		}
	   	}

	   	$division = $diviT;
	   	return false;

    }

}

新数组输出如下:

array(17) {
  [0] => string(5) "menu1"
  [1] => string(10) "|--menu1-1"
  [2] => string(13) "|--|--menu7-1"
  [3] => string(17) "|--|--|--menu10-1"
  [4] => string(17) "|--|--|--menu10-2"
  [5] => string(17) "|--|--|--menu10-3"
  [6] => string(13) "|--|--menu7-2"
  [7] => string(13) "|--|--menu7-3"
  [8] => string(13) "|--|--menu7-4"
  [9] => string(10) "|--menu1-2"
  [10] => string(13) "|--|--menu8-1"
  [11] => string(10) "|--menu1-3"
  [12] => string(5) "menu2"
  [13] => string(5) "menu3"
  [14] => string(5) "menu4"
  [15] => string(5) "menu5"
  [16] => string(5) "menu6"
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值