无限极分类管理之数据查询和有序整理

50 篇文章 0 订阅
34 篇文章 0 订阅

在使用无限极分类管理数据的技术的时候,我们常常面临一些必要的麻烦。棋种最重要也是最基本的就是怎么把查出的信息整理好。比如把信息分类,子类信息要放到父类信息中,实现嵌套,从而让查询出来的数据有序化,便于后续的使用。这个过程个人理解为序列化(跟前端表单提交数据的序列化没有联系)—-将杂乱的数据信息通过内在的联系整理为有序,有规则的有序数组的过程。
举个例子:
数据库中有以下数据:
这里写图片描述
通过php查询出来是二位数组:

//php查询代码:
$rs = array();
$type = array();
//查找出数据库中所有的数据,放入数组中保存。后续所有查找都在在数组中进行。
$sql = 'select * from type  ' ;
$rs = mysql_query( $sql );
while( $row = mysql_fetch_array( $rs ,MYSQL_ASSOC) )
{
    $type[$row['id']] =  $row ;
}

打印结果:
这里写图片描述

可以看到这样的数据使用并不是很方便,特别是在类型关系的展现上显得凌乱。
我们希望的数组形式应该是:
这里写图片描述

//php
 *   [1]=>[
 *          []=>[],
 *          []=>[]
 *          ]
 *   [2]=>[
 *  `       []=>[];
 *          []=>[
 *                  []=>[]
 *              ]
 *          ]
 *  第一级  第二级   第三级
    [] =[
            [1]=>[
                    ['吴国'],
                    ['sub']=>[
                            ['孙权'],
                            ['陆逊'],
                        ]
                    ],
            [2]=>[
                ['魏国'],
                ['sub']=>[
                        ['曹操'],
                    ]
                ],
            [3]=>[
                ['蜀国'],
                ['sub']=>[
                        ['刘备'],
                    ]
                ]   
        ]   
//         第一层   第二层   第三层

为了得到以上格式的数据。需要经过2个步骤。
第一查询数据。只要有id就能找到这个id所对应的数组。

//php代码
//在数组中查找指定的id
function  findPid ( $pid = 1 , & $arr = array() ,$boo = false ,$a =array()  )
{
    if( is_array( $arr ) )
    {
        foreach ( $arr as $k=>  $v )
        {
            if (  $k == $pid )
            {
                //echo "这是{$k}的<br/>";
               // print_r( $v );
                if( ! $boo )
                {
                    //$boo是false表示只找
                    return $arr[$k];
                }
                else
                {
                    if( isset( $arr[$k]['sub'] )  )
                    {
                        //有子类型
                        $arr[$k]['sub'] [$a['id']] = $a   ;
                    }
                    else
                    {
                        //没有子类型
                        $arr[$k]['sub'] = array()   ;
                        $arr[$k]['sub'] [$a['id']] = $a   ;
                    }
                    return true;
                }
            }
            else
            {
                if( isset( $v['sub'] ) )
                {
                      findPid( $pid , $v  ,$boo ,$a);//递归
                }
            }
        }
    }
    else
    {
        return false;
    }
}

第二步将子类型的数组和父类型数组合并。
比如:将元素曹操放到魏国类型下面。并在魏国数组中创建’sub’属性,其内容为元素的pid为魏国的id。

//php
function   getLeaderArray( $array = array() )
{
    $leaderArray = array ();
    if( is_array( $array )  )
    {
        //必须是数组
        foreach ( $array as $k=> $v  )
        {
            if( $v['pid'] == 0 )
            {
                //顶层数组保留
                $leaderArray[$k] = $v ;
            }
            else
            {
                //否则要放到其父类型的'sub'属性里面
               if( findPid( $v['pid'] , $leaderArray  , true , $array[$k]  ))//找到父类型添加进父类型或者没找到
               {
                    //子类型添加完成
               }
                else
                {
                    //在数组中没有找到
                    // 自动将改父类型补充为顶层元素
                    $leaderArray[$v['pid']] = [
                                                                        'id'=> $v['pid'],
                                                                'pid'  =>0,
                                                                'name'=>'',
                                                                'sub'=> [
                                                                           $k=> $array[$k]
                                                                        ]
                                                ];
                }
            }
        }
        return $leaderArray;
    }
    else
    {
        return $array;
    }
}

经过以上2个步骤,数组可以整理得到如下形式:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Laravel 中,使用模型关联实现无限级分类时,可以使用 `whereHas` 方法限定查询结果的深度。例如,如果你想获取所有分类的第一级子分类,可以这样写: ```php $categories = Category::where('parent_id', 0) ->with('children') ->get(); ``` 如果你想获取所有分类的前两级子分类,可以这样写: ```php $categories = Category::where('parent_id', 0) ->with(['children' => function ($query) { $query->where('parent_id', '>', 0); }, 'children.children']) ->get(); ``` 在上面的代码中,我们使用了 `with` 方法来预加载分类的子分类,使用了匿名函数来限制子分类的深度。具体来说,我们在第一级子分类查询中,使用了 `where` 方法来排除了所有 `parent_id` 为 0 的分类,这样就只剩下了第二级子分类。然后,在第二级子分类查询中,我们又使用了 `with` 方法来预加载了第三级子分类。 如果你想获取所有分类的前三级子分类,可以继续套用上面的代码,使用匿名函数来限制第三级子分类的深度。以此类推。 如果你希望从查询结果中排除多出来的数据,可以使用 `unsetRelation` 方法来删除不需要的关联。例如,如果你只需要第一级子分类,可以这样写: ```php $categories = Category::where('parent_id', 0) ->with('children') ->get() ->each(function ($category) { $category->unsetRelation('children'); }); ``` 在上面的代码中,我们使用了 `each` 方法来遍历查询结果,然后使用 `unsetRelation` 方法来删除每个分类的子分类关联。这样,最终的查询结果中就只剩下了第一级子分类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值