91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在php中利用前序遍歷樹實現無需遞歸的無限極分類

發布時間:2021-02-07 20:32:44 來源:億速云 閱讀:135 作者:Leah 欄目:開發技術

這篇文章給大家介紹怎么在php中利用前序遍歷樹實現無需遞歸的無限極分類,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

sql代碼如下:

CREATE TABLE IF NOT EXISTS `category` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `title` varchar(50) NOT NULL,
 `lft` int(11) NOT NULL,
 `rgt` int(11) NOT NULL,
 `order` int(11) NOT NULL COMMENT '排序',
 `create_time` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=12 ;
--
-- 轉存表中的數據 `category`
--
INSERT INTO `category` (`id`, `title`, `lft`, `rgt`, `order`, `create_time`) VALUES
(1, '頂級欄目', 1, 20, 1, 1261964806),
(2, '編輯后的分類', 16, 19, 50, 1264586212),
(4, '公司產品', 10, 15, 50, 1264586249),
(5, '榮譽資質', 8, 9, 50, 1264586270),
(6, '資料下載', 6, 7, 50, 1264586295),
(7, '人才招聘', 4, 5, 50, 1264586314),
(8, '留言板', 2, 3, 50, 1264586884),
(9, '總裁', 17, 18, 50, 1267771951),
(10, '新的分類的子分類', 11, 14, 0, 1400044841),
(11, 'PHP點點通-http://www.phpddt.com', 12, 13, 0, 1400044901);

php代碼如下:

<?php
/**
 * 純屬測試
 * 
 * @author Mckee
 * @link http://www.phpddt.com
 */
class Category extends CI_Controller {
  public function __construct()
  {
    parent::__construct();
    $this->load->database();
  }
  public function view()
  {
    $lists = $this->db->order_by('lft', 'asc')->get('category')->result_array();
    //相鄰的兩條記錄的右值第一條的右值比第二條的大那么就是他的父類
    //我們用一個數組來存儲上一條記錄的右值,再把它和本條記錄的右值比較,如果前者比后者小,說明不是父子關系,就用array_pop彈出數組,否則就保留
    //兩個循環而已,沒有遞歸
    $parent = array();
    $arr_list = array();
    foreach($lists as $item){
      if(count($parent)){
        while (count($parent) -1 > 0 && $parent[count($parent) -1]['rgt'] < $item['rgt']){
          array_pop($parent);
        }  
      }
      $item['depath'] = count($parent);
      $parent[] = $item;
      $arr_list[]= $item;
    }
    //顯示樹狀結構
    foreach($arr_list as $a)
    {
      echo str_repeat('--', $a['depath']) . $a['title'] . '<br />';
    }
  }
  /**
   * 
   * 插入操作很簡單找到其父節點,之后把左值和右值大于父節點左值的節點的左右值加上2,之后再插入本節點,左右值分別為父節點左值加一和加二
   */
  public function add()
  {
    //獲取到父級分類的id
    $parent_id = 10;
    $parent_category = $this->db->where('id', $parent_id)->get('category')->row_array();
    //1.左值和右值大于父節點左值的節點的左右值加上2
    $this->db->set('lft', 'lft + 2', FALSE)->where(array('lft >' => $parent_category['lft']))->update('category');
    $this->db->set('rgt', 'rgt + 2', FALSE)->where(array('rgt >' => $parent_category['lft']))->update('category');
    //2.插入新的節點
    $this->db->insert('category', array(
      'title' => '新的分類的子分類',
      'lft' => $parent_category['lft'] + 1,
      'rgt' => $parent_category['lft'] + 2,
      'order' => 0,
      'create_time' => time()
    ));
    echo 'add success';
  }
  /**
   * 刪除
   * 
   * //1.得到刪除的節點,將右值減去左值然后加1,得到值$width = $rgt - $lft + 1;
   * //2.刪除左右值之間的所有節點
   * //3.修改條件為大于本節點右值的所有節點,操作為把他們的左右值都減去$width
   */
  public function delete()
  {
    //通過分類id獲取分類
    $id = 3;
    $category = $this->db->where('id', $id)->get('category')->row_array();
    //計算$width
    $width = $category['rgt'] - $category['lft'] + 1;
    //1.刪除該條分類
    $this->db->delete('category', array('id' => $id));
    //2.刪除左右值之間的所有分類
    $this->db->delete('category', array('lft >' => $category['lft'], 'lft <' => $category['rgt']));
    //3.修改其它節點的值
    $this->db->set('lft', "lft - {$width}", FALSE)->where(array('lft >' => $category['rgt']))->update('category');
    $this->db->set('rgt', "rgt - {$width}", FALSE)->where(array('rgt >' => $category['rgt']))->update('category');
    echo 'delete success';
  }
  //編輯,
  public function edit()
  {
    //不用說了, 直接通過id編輯
    $id = 2;
    $this->db->update('category', array(
      'title' => '編輯后的分類'
    ), array(
      'id' => $id
    ));
    echo 'edit success';
  }
}

關于怎么在php中利用前序遍歷樹實現無需遞歸的無限極分類就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

桦甸市| 江阴市| 瓮安县| 阜新市| 广宗县| 额敏县| 东阿县| 邢台市| 九龙城区| 四子王旗| 丹寨县| 永昌县| 门源| 云梦县| 师宗县| 高清| 都安| 板桥市| 土默特右旗| 镇平县| 资中县| 油尖旺区| 天峻县| 广南县| 大化| 开封市| 宿州市| 赣州市| 马龙县| 武城县| 板桥市| 昌宁县| 北票市| 华池县| 贵溪市| 西乡县| 嫩江县| 离岛区| 友谊县| 武鸣县| 彰化市|