<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      php優化遞歸算法優化

      2023年8月7日13:59:31

      因為最近開發自己的一些常用系統,所以為了自由度較高一點,經常分類都是無限層級,所以遞歸用的比較多,但是發現當分類大于三層,數據1萬以上遞歸就會很慢,所以一直在尋求優化算法,使用使用chagpt優化的算法,基本無法使用,后續想到用php原生函數來使用,結果性能飆升

      數據庫結構:

      CREATE TABLE `admin_permission` (
       `id` bigint unsigned NOT NULL AUTO_INCREMENT,
       `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
       `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
       `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '備注',
       `is_delete` tinyint(1) NOT NULL DEFAULT '10' COMMENT '10默認99刪除',
       `parent_permission_id` int unsigned NOT NULL DEFAULT '0' COMMENT '父ID 0是頂級',
       `permission_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '控制名稱',
       `permission_url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '前臺控制器URL',
       `name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '組件名稱',
       `backstage_permission_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '后臺權限URL',
       `tag` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '標簽,標志',
       `is_menu` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '作為菜單顯示,1是,2不是',
       `small_icon_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'pc端圖標',
       `redirect` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '跳轉頁面',
       `component` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '組件類型',
       `keep_alive` tinyint NOT NULL DEFAULT '1' COMMENT '是否keep_alive',
       `hidden` tinyint(1) DEFAULT '10' COMMENT '菜單是否顯示10顯示20不顯示',
       PRIMARY KEY (`id`),
       KEY `parent_permission_id` (`parent_permission_id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=14384 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='管理員權限表';
      

      生產測試數據:,隨便自己插入幾條數據,然后使用下面的方法在第三層生成測試數據

      $list = AdminPermission::orderBy('id', 'asc')->get()->toArray();
              $array = self::treeMenu($list, 0, 'parent_permission_id');
      
      //        pp($array);
             // 制造10000+的測試數據,測試算法姓名
              foreach ($array as $k => &$v) {
                  if (!empty($v['children'])) {
                      foreach ($v['children'] as $kk => &$vv) {
                          if (!empty($vv['children'])) {
                              foreach ($vv['children'] as $kkk => &$vvv) {
      
                                  unset($vvv['label']);
                                  unset($vvv['id']);
                                  for ($i = 1; $i <= 100; $i++) {
                                      DB::table('admin_permission')->insert($vvv);
                                  }
                              }
                          }
                      }
                  }
              }
      

      php實現

          //遞歸數據
          public static function treeMenu(array $menu = [], int $parent = 0, string $parentKey = 'parent_id')
          {
              $tree = array();
              foreach ($menu as $v) {
                  if ($v[$parentKey] == $parent) {
                      $v['children'] = self::treeMenu($menu, $v['id'], $parentKey);
                      if (empty($v['children'])) {
                          unset($v['children']);
                      }
                      $tree[] = $v;
                  }
              }
              return $tree;
          }
      

      使用php原生函數實現的,默認三層搜索

      $tree = array_filter($list, function ($permission) use ($parent_id, $parentKey) {
                  return $permission[$parentKey] == $parent_id;
              });
              if (!empty($tree)) {
                  foreach ($tree as &$v) {
      
                      $parent_id = $v['id'];
                      $v['children'] = array_filter($list, function ($permission) use ($parent_id, $parentKey) {
                          return $permission[$parentKey] == $parent_id;
                      });
      
                      if (!empty($v['children'])) {
                          foreach ($v['children'] as &$vv) {
      
                              $parent_id = $vv['id'];
                              $vv['children'] = array_filter($list, function ($permission) use ($parent_id, $parentKey) {
                                  return $permission[$parentKey] == $parent_id;
                              });
      
      //                        if (!empty($vv['children'])) {
      //                            foreach ($vv['children'] as &$vvv) {
      //
      //                                $parent_id = $vvv['id'];
      //                                $vvv['children'] = array_filter($list, function ($permission) use ($parent_id, $parentKey) {
      //                                    return $permission[$parentKey] == $parent_id;
      //                                });
      //                            }
      //                        }
                          }
                      }
                  }
              }
      
      

      測試:

      1,php實現方法測試:

      第一次:
      待遞歸總數--:14350
      開始時間:2023-08-08 10:28:22
      結束時間:2023-08-08 10:28:28
      
      第二次:
      待遞歸總數--:14350
      開始時間:2023-08-08 10:29:04
      結束時間:2023-08-08 10:29:09
      

      2,php原生實現方法測試:

      第一次:
      待遞歸總數--:14350
      開始時間:2023-08-08 10:30:46
      結束時間:2023-08-08 10:30:46
      
      第二次:
      待遞歸總數--:14350
      開始時間:2023-08-08 10:31:00
      結束時間:2023-08-08 10:31:01
      

      完整代碼:

      public function index(Request $request)
          {
              $list = AdminPermission::orderBy('id', 'asc')->get()->toArray();
              $array = self::treeMenu($list, 0, 'parent_permission_id');
      
      //        pp($array);
             // 制造10000+的測試數據,測試算法姓名
              foreach ($array as $k => &$v) {
                  if (!empty($v['children'])) {
                      foreach ($v['children'] as $kk => &$vv) {
                          if (!empty($vv['children'])) {
                              foreach ($vv['children'] as $kkk => &$vvv) {
      
                                  unset($vvv['label']);
                                  unset($vvv['id']);
                                  for ($i = 1; $i <= 100; $i++) {
                                      DB::table('admin_permission')->insert($vvv);
                                  }
                              }
                          }
                      }
                  }
              }
      //die;
      
              $count = AdminPermission::orderBy('id', 'asc')->get()->count();
              p('待遞歸總數--:' . $count);
      
              $list = AdminPermission::orderBy('id', 'asc')->get(['id', 'parent_permission_id', 'permission_name'])->toArray();
      
              //php代碼實現遞歸
              p('開始時間:' . date('Y-m-d H:i:s'));
              $rr = self::treeMenu($list, 0, 'parent_permission_id');
              p('結束時間:' . date('Y-m-d H:i:s'));
      
              //php原生函數實現遞歸 
              p('開始時間:' . date('Y-m-d H:i:s'));
              $parent_id = 0;
              $parentKey = 'parent_permission_id';
      
              $tree = array_filter($list, function ($permission) use ($parent_id, $parentKey) {
                  return $permission[$parentKey] == $parent_id;
              });
              if (!empty($tree)) {
                  foreach ($tree as &$v) {
      
                      $parent_id = $v['id'];
                      $v['children'] = array_filter($list, function ($permission) use ($parent_id, $parentKey) {
                          return $permission[$parentKey] == $parent_id;
                      });
      
                      if (!empty($v['children'])) {
                          foreach ($v['children'] as &$vv) {
      
                              $parent_id = $vv['id'];
                              $vv['children'] = array_filter($list, function ($permission) use ($parent_id, $parentKey) {
                                  return $permission[$parentKey] == $parent_id;
                              });
      
      //                        if (!empty($vv['children'])) {
      //                            foreach ($vv['children'] as &$vvv) {
      //
      //                                $parent_id = $vvv['id'];
      //                                $vvv['children'] = array_filter($list, function ($permission) use ($parent_id, $parentKey) {
      //                                    return $permission[$parentKey] == $parent_id;
      //                                });
      //                            }
      //                        }
                          }
                      }
                  }
              }
              p('結束時間:' . date('Y-m-d H:i:s'));
              pp($tree);
          }
      
          //遞歸數據
          public static function treeMenu(array $menu = [], int $parent = 0, string $parentKey = 'parent_id')
          {
              $tree = array();
              foreach ($menu as $v) {
                  if ($v[$parentKey] == $parent) {
                      $v['children'] = self::treeMenu($menu, $v['id'], $parentKey);
                      if (empty($v['children'])) {
                          unset($v['children']);
                      }
                      $tree[] = $v;
                  }
              }
              return $tree;
          }
      

      總結

      1,如果使用php實現某些算法性能不好的時候,一定要使用php原生函數試試
      2,如果使用php原生函數也無法解決性能問題,建議使用不同請求模式來解決了,比如實現海量無線分類使用異步請求,一級請求之后,如果要打開某個二級就異步請求數據來展示,延遲加載和分頁查詢:在處理菜單數據時,不立即加載所有子菜單項,而是在需要訪問子菜單時再進行加載??梢允褂梅猪摬樵兊姆绞剑看沃徊樵円徊糠謹祿瑴p少內存使用和查詢時間。
      3,使用chatgpt來優化算法,不太靠譜

      posted on 2023-08-08 10:37  zh7314  閱讀(111)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 亚洲精品97久久中文字幕无码| 日本一区二区中文字幕久久| 国产成人无码免费视频麻豆| 城市| 亚洲国产婷婷综合在线精品| 色一情一乱一伦麻豆| 国产69精品久久久久人妻刘玥| 国产另类ts人妖一区二区| 精品一日韩美女性夜视频| 亚洲精品麻豆一二三区| 亚洲AV日韩精品久久久久| 国产成人久久蜜一区二区| 久久国产精99精产国高潮| 九九综合va免费看| 久久国产精品不只是精品| 美女黄网站18禁免费看| 国产精品久久久久7777| 激情伊人五月天久久综合| 亚洲AV旡码高清在线观看| 商南县| 久久综合开心激情五月天| 亚洲成A人片在线观看的电影| 色综合久久蜜芽国产精品 | 国产视频不卡一区二区三区| 无码国产偷倩在线播放老年人| 国产精品福利自产拍在线观看 | 阳新县| 99在线国内在线视频22| 国精品午夜福利视频| 久久久久免费看成人影片| 日本真人做爰免费的视频| 97精品亚成在人线免视频| 无码精品人妻一区二区三区中 | 国产精品无码免费播放| 熟妇人妻久久精品一区二区| 国产午夜精品理论大片| 丰满岳乱妇久久久| 精品亚洲精品日韩精品| 国产福利萌白酱在线观看视频| 激情综合色区网激情五月| 国产精品剧情亚洲二区|