参考地址:https://bubaijun.com/page.php?id=140
https://learnku.com/laravel/t/31828
https://wi1dcard.dev/posts/php-fastest-create-tree-from-list/
返回数据是一维数组的代码(以上方法只是进行了排序,并不会对数组结构进行改变):
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;
// 去掉已经处理过的数据,这一步是关键,可以提高效率
unset($data[$key]);
//使用当前数据记录的 ID 进行再次循环排序
$this->sort_data($data, $value['id'], $root + 1);
}
}
return $new_data;
}
有时候还会需要对数据进行修改结构。比如使用 Layui 的树形组件,就会有这样的数据格式要求:
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;
}
网友评论