php 如何把查询的有关联的数据格式转换为树状格式

一提到树状格式,就感觉好像很高大上,其实查询数据库也可以查出这样的格式,但是可能需要在sql上的能力稍微强一些,另外简单的方法也就是查询完了再循环查了,但是这种方式十分的耗费资源,性能很低,如果产品上线并发一上来肯定是不行的,所以不建议这样做。哪如何才能简单的查询,又提高效率呢,就是从代码中来解决这样的问题,效率高查询还简单。

先了解一下需求吧,比如联动效果,那种地区的三级联动,多级分类,多级菜单。我们可以发现。其实大部分这种需求的数据量并不大。那就先说一下,解决问题的逻辑。首先先把数据一次性都查出来(非常简单的sql),拿到数据以后,先根据最高父级id来把最外层取到,然后再根据最外层的父级id再数据中拿出来放到最外层的数据集中,以此类推,你需要多少级,那么就处理多少层就解决了。当然我用的这个方法也是可以继续优化的,比如说让他无限处理到最底层,但是一般这种需求我们碰不到,一般也就两三层。所以我只封装两个方法来使用就足够了

1、控制器

	/***
     * @return mixed
     * @author lifang
     * @info 获取分类列表(公共使用)
     */
    public function cateList()
    {
        $arrData = app(Categorys::class)->getAll();
        
        $arrCate = parentTree($arrData);

        return json_response($arrCate,'获取成功',200);
    }

2、处理最外层数据,公共调用方法,这里也可以把数据排序加上,我没加,如果你的需求有,哪加个排序方法处理,可以把你的数据固定位置

/***
 * @param $arrData
 * @param int $sParent
 * @return array
 * @author lifang
 * @info 基础处理
 */
function tree( $arrData,$sParent=0 )
{
    $arrNew = [];
    foreach ( $arrData as $key=>$value )
    {
        if ( $value['pid'] == $sParent )
        {
            $arrNew[] = $value;
        }
    }
    return $arrNew;
}

3、内层数据

/***
 * @param $arrData
 * @return array
 * @author lifang
 * @info 组装内层
 */
function parentTree( $arrData )
{
    if ( !is_array($arrData) || count($arrData) < 1 )
    {
        return [];
    }
    $arrNew = tree($arrData);
    foreach ( $arrNew as $k=>$v)
    {
        $arrNew[$k]['parent'] = tree($arrData,$v['id']);
    }
    return $arrNew;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值