Laravel - 選單遞迴及排序

PHPSIX發表於2017-11-20
  • 遞迴選單資料:
    首選我們需要在 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 - 將專案按照字串比較

老郭部落格:laughing:
個人部落格地址:https://www.phpsix.com

相關文章