mysql和php无限分类 数据归类 输出
来源:互联网 发布:百知尚行 编辑:程序博客网 时间:2024/06/13 15:10
说明在先:数据整合部分参考了网上博客;但是数据输出是自己写的,使用了递归;
数据归类解释:利用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=InnoDBDEFAULT CHARACTER SET=latin1 COLLATE=latin1_swedish_ciAUTO_INCREMENT=1ROW_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框架
<?phpnamespace 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"}
阅读全文