2019-10-08 18:12:51
围观(7742)
实际项目经常会遇到需要无限极分类,下面是 DEMO ,根据实际需求稍微改改就能用。
将下面代码写入控制器中:
public function get_all_data() { //TP框架查询所有数据: //$data = (new UserModel)->select(); //Laravel 框架查询所有数据: $data = (new UserModel)->get(); $res = $this->sort_data($data); dump($res); } public function sort_data($data, $pid = 0, $root = 1) { static $new_data = []; //循环遍历传递过来的数据 foreach ($data as $key => $value) { //判断数据的上级 ID 是否等于当前 ID,最顶级 ID 为 0 //这里的上级 ID 在数据库中的字段为 parent_id if ($value['parent_id'] == $pid) { $new_data[] = $value; $value['root'] = $root; //使用当前数据记录的 ID 进行再次循环排序 $this->sort_data($data, $value['id'], $root + 1); } } return $new_data; }
注意:此方法是递归方法实现,数据量太大可能会造成崩溃。
以上方法只是进行了排序,并不会对数组结构进行改变。有时候还会需要对数据进行修改结构。比如使用 Layui 的树形组件,就会有这样的数据格式要求:
[{ title: '一级菜单', children: [{ title: '二级菜单', children: [{ title: '三级菜单' //…… //以此类推, 无限层级 }] }]
那就可以调用下面这个方法:
public function sort_data($data, $pk = 'id', $pid = 'pid', $child = 'children', $root = 0) { // 创建Tree $tree = []; if (!is_array($data)) { return false; } //创建基于主键的数组引用 $refer = []; foreach ($data as $key => $value_data) { $refer[$value_data[$pk]] = &$data[$key]; } foreach ($data as $key => $value_data) { // 判断是否存在parent $parentId = $value_data[$pid]; if ($root == $parentId) { $tree[] = &$data[$key]; } else { if (isset($refer[$parentId])) { $parent = &$refer[$parentId]; $parent[$child][] = &$data[$key]; } } } return $tree; }
此时会发现数据还是稍微有点乱的,因为数据库字段挺多的。但是像 Layui 这样的组件,只需要用到 title 字段。
可以在 get_all_data 函数里使用循环遍历并使用 unset 函数去掉没用的字段。
public function get_all_data() { //TP 框架查询所有数据: //$data = (new UserModel)->select(); //Laravel 框架查询所有数据: $data = (new UserModel)->get(); foreach ($data as $key => $value) { unset($data[$key]['content']); unset($data[$key]['list']); //... 以此类推 } $res = $this->sort_data($data); dump($res); }
如果你的字段实在太多,还可以这样保留只需要的字段:
public function get_all_data() { //TP框架查询所有数据: //$data = (new UserModel)->select(); //Laravel 框架查询所有数据: $data = (new UserModel)->get(); $new_data = []; foreach ($data as $key => $value) { $new_data[$key]['id'] = $value['id']; $new_data[$key]['pid'] = $value['pid']; $new_data[$key]['title'] = $value['title']; //... 以此类推 //此方法一定要将 id 和 pid 也存入新数组,否则无法实现无限级。 } $res = $this->sort_data($data); dump($res); }
最后可以得到很简约的 json 字串。
本文地址 : bubaijun.com/page.php?id=140
版权声明 : 未经允许禁止转载!
上一篇文章: 使用JS开发一个简单的“三七过”小游戏
下一篇文章: TP框架用百度提供的数据写三级联动效果