Laravel - 菜单递归及排序

菜单递归及排序-start

  • 递归菜单数据:
    首选我们需要在 app\Repositories\Eloquent\MenuRepository.php 文件中编写递归程序。
    详细代码:

    <?php 
    namespace App\Repositories\Eloquent;
    
    use App\Repositories\Eloquent\Repository;
    use App\Models\Menu;
    use Cache;
    /**
    * 菜单仓库
    */
    class MenuRepository extends Repository
    {
            public function model()
            {
                return Menu::class;
            }
    
            /*
            * 递归调用菜单数据
            */
            public function sortMenu($menus,$pid=0)
            {
                $arr = [];
                if (empty($menus)) {
                    return '';
                }
    
                foreach ($menus as $key => $value) {
                    if ($value['parent_id'] == $pid) {
                        $arr[$key] = $value;
                        $arr[$key]['child'] = self::sortMenu($menus,$value['id']);
                    }
                }
                return $arr;
            }

    然后再从控制器中调用该方法,即可实现递归菜单数据。

    $menus = $this->menu->sortMenu($this->menu->all()->toArray());
  • 排序子菜单并缓存:
    首选我们需要在 app\Repositories\Eloquent\MenuRepository.php 文件中继续编写对子菜单进行排序的方法:

    /*
    * 排序子菜单并缓存
    * ---------------------------------
    * array_column($array,$name)
    * $array => 要查询的数组
    * $name  => 在数组中要返回的字段值
    *----------------------------------
    * array_multisort($array1,$rule,$array2)
    * $array1 => 规定数组(规定以这个数组来排序)
    * $rule   => 规定排列顺序。
    * 可能的值:
    *   SORT_ASC - 默认。按升序排列 (A-Z)。
    *   SORT_DESC - 按降序排列 (Z-A)。
    * $array2 => 要规定的数组。(要排序的数组)
    */
    public function sortMenuSetCache()
    {
        $menus = $this->model->orderBy('sort','desc')->get()->toArray();
        if ($menus) {
            $menuList = $this->sortMenu($menus);
            foreach ($menuList as $key => $value) {
                if ($value['child']) {
                    $sort = array_column($value['child'], 'sort');
                    array_multisort($sort,SORT_DESC,$value['child']);
                }
            }
    
            //缓存菜单数据
            Cache::forever(config('admin.globals.cache.menuList'), $menuList);
            return $menuList;
        }
        return '';
    }
  • PHP两个方法补充说明:

    • array_column(参数1,参数2)方法详解:
      返回输入数组中某个单一列的值,并以一维数组的形式返回。
      参数1:要查询的数组。
      参数2:在数组中要返回的字段值。
      例子:
      $records = array(
          array(
                  'id' => 2135,
                  'first_name' => 'John',
                  'last_name' => 'Doe',
          ),
          array(
                  'id' => 3245,
                  'first_name' => 'Sally',
                  'last_name' => 'Smith',
          ),
          array(
                  'id' => 5342,
                  'first_name' => 'Jane',
                  'last_name' => 'Jones',
          ),
          array(
                  'id' => 5623,
                  'first_name' => 'Peter',
                  'last_name' => 'Doe',
          )
      );
      $first_names = array_column($records, 'first_name');
      print_r($first_names);

      以上例程会输出:

      Array ( [0] => John [1] => Sally [2] => Jane [3] => Peter )
    • array_multisort(参数1,参数2,参数3)方法详解:
      对多个数组或多维数组进行排序
      本函数返回排序数组。您可以输入一个或多个数组。函数先对第一个数组进行排序,接着是其他数组,如果两个或多个值相同,它将对下一个数组进行排序。
      参数1:规定数组(规定以这个数组来排序)
      参数2:规定排列顺序。可能的值:
      SORT_ASC - 默认。按升序排列 (A-Z)。
      SORT_DESC - 按降序排列 (Z-A)。
      参数3:要规定的数组。(要排序的数组)

      bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]] )
      排序顺序标志:
      
      * SORT\_ASC - 按照上升顺序排序
      * SORT\_DESC - 按照下降顺序排序
      
      排序类型标志:
      
      * SORT\_REGULAR - 将项目按照通常方法比较
      * SORT\_NUMERIC - 将项目按照数值比较
      * SORT\_STRING - 将项目按照字符串比较

菜单递归及排序-end

本作品采用《CC 协议》,转载必须注明作者和本文链接
老郭博客:laughing: 个人博客地址:www.phpsix.com
PHPSIX
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!