php递归如何获取无限上级ID
吾爱主题
阅读:252
2022-11-20 16:50:00
评论:0
php递归获取无限上级ID
数据库结构
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | CREATE TABLE `fcxlt_authuser` ( `id` int (11) NOT NULL AUTO_INCREMENT, `username` varchar (50) NOT NULL COMMENT '用户名' , ` password ` varchar (64) NOT NULL COMMENT '密码' , `nickname` varchar (50) NOT NULL COMMENT '昵称' , `phone` varchar (20) DEFAULT NULL COMMENT '电话' , `weixin_id` varchar (20) DEFAULT NULL COMMENT '微信号' , `qrcode` varchar (200) DEFAULT NULL COMMENT '二维码Base64' , `auth_id` int (11) NOT NULL , `is_authed` int (11) NOT NULL , `createtime` int (11) NOT NULL DEFAULT '1523156898' , PRIMARY KEY (`id`), KEY `nickname` (`nickname`), KEY `auth_id` (`auth_id`,`id`,`username`,`nickname`) USING BTREE, KEY `username` (`username`,`is_authed`,` password `) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=103 DEFAULT CHARSET=utf8mb4 |
其中auth_id是上级ID,无限分级
递归代码
注意:在引用递归函数本身的时候,一定要return $this->递归函数,否则返回NULL
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public function getWinfo( $id , $res = '' ){ if ( $id >1){ $infos = Db::name( 'authuser' ) ->alias( 'a' ) ->where( 'a.id' , $id ) ->join( 'fcxlt_authuser b' , 'a.auth_id=b.id' , 'LEFT' ) ->field( 'a.auth_id as id' ) ->find(); // dump($infos); if (! empty ( $infos ) && $infos [ 'id' ]>1){ $res .= $infos [ 'id' ]. "," ; return $this ->getWinfo( $infos [ 'id' ], $res ); } else { return $res ; } } else { return $res ; } } |
控制器调用
?1 2 3 | $ids = $this ->getWinfo( $id , $res = $id . ',' ); $id_in = substr ( $ids ,0, strlen ( $ids )-1); $id_arr = explode ( ',' , $id_in ); |
php无限极分类(递归)
建表的时候,增加一个PID字段用来区别自己所属的分类
id | pid | name |
---|---|---|
1 | 0 | 汽车 |
2 | 1 | 欧拉 |
3 | 1 | 吉利 |
4 | 3 | 沃尔沃 |
5 | 1 | 大众 |
代码
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | /** * 递归实现无限极分类 * @param $array 分类数据 * @param $pid 父ID * @param $level 分类级别 * @return $list 分好类的数组 直接遍历即可 $level可以用来遍历缩进 */ function getTree( $array , $pid =0, $level = 0){ //声明静态数组,避免递归调用时,多次声明导致数组覆盖 static $list = []; foreach ( $array as $key => $value ){ //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点 if ( $value [ 'pid' ] == $pid ){ //父节点为根节点的节点,级别为0,也就是第一级 $value [ 'level' ] = $level ; //把数组放到list中 $list [] = $value ; //把这个节点从数组中移除,减少后续递归消耗 unset( $array [ $key ]); //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1 getTree( $array , $value [ 'id' ], $level +1); } } return $list ; } /* * 获得递归完的数据,遍历生成分类 */ $array = getTree( $array ); foreach ( $array ) as $value { echo str_repeat ( '--' , $value [ 'level' ]), $value [ 'name' ]. '<br />' ; } //输出结果 无限极分类实现ok /** 河北省 --邯郸市 ----永年区 --武安市 北京市 --朝阳区 ----望京 ----酒仙桥 --通州区 **/ |
PHP null转成空字符串
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public function convertNullToEmptyString( $data ) { $data = collect( $data )->map( function ( $value ){ if ( is_null ( $value )) { return '' ; } return is_array ( $value ) ? $this ->convertNullToEmptyString( $value ) : $value ; }); return $data ->toArray(); } $data = array ( [ 'name' => 'shawn' , 'email' => 'shw@qq.com' , 'company' => 'aa' ], [ 'name' => '111' , 'email' => 'ssdfas@dasf' , 'company' => 'ssdfa' ] ); var_dump( $this ->convertNullToEmptyString( $data )); die ; |
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/u013252962/article/details/99735588
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。