中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么在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

青州市| 德保县| 黄陵县| 宁蒗| 湄潭县| 滁州市| 旌德县| 高阳县| 建水县| 乃东县| 庆云县| 定陶县| 卓资县| 禹州市| 南投市| 临安市| 芦山县| 阳泉市| 咸丰县| 崇信县| 宝山区| 南城县| 子长县| 巴楚县| 治多县| 苏尼特左旗| 日土县| 措勤县| 罗定市| 封开县| 如皋市| 阳高县| 武川县| 交口县| 巴青县| 濮阳市| 五大连池市| 海兴县| 法库县| 错那县| 尚志市|