最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php通過前序遍歷樹實(shí)現(xiàn)無需遞歸的無限極分類

 更新時間:2015年07月10日 10:29:02   作者:mckee  
這篇文章主要介紹了php通過前序遍歷樹實(shí)現(xiàn)無需遞歸的無限極分類,涉及基于CI框架針對數(shù)據(jù)庫的查詢與遍歷操作,具有一定參考借鑒價值,需要的朋友可以參考下

本文實(shí)例講述了php通過前序遍歷樹實(shí)現(xiàn)無需遞歸的無限極分類。分享給大家供大家參考。具體如下:

大家通常都是使用遞歸實(shí)現(xiàn)無限極分類都知道遞歸效率很低,下面介紹一種改進(jìn)的前序遍歷樹算法,不適用遞歸實(shí)現(xiàn)無限極分類,在大數(shù)據(jù)量實(shí)現(xiàn)樹狀層級結(jié)構(gòu)的時候效率更高。

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 ;
--
-- 轉(zhuǎn)存表中的數(shù)據(jù) `category`
--
INSERT INTO `category` (`id`, `title`, `lft`, `rgt`, `order`, `create_time`) VALUES
(1, '頂級欄目', 1, 20, 1, 1261964806),
(2, '編輯后的分類', 16, 19, 50, 1264586212),
(4, '公司產(chǎn)品', 10, 15, 50, 1264586249),
(5, '榮譽(yù)資質(zhì)', 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點(diǎn)點(diǎn)通-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();
    //相鄰的兩條記錄的右值第一條的右值比第二條的大那么就是他的父類
    //我們用一個數(shù)組來存儲上一條記錄的右值,再把它和本條記錄的右值比較,如果前者比后者小,說明不是父子關(guān)系,就用array_pop彈出數(shù)組,否則就保留
    //兩個循環(huán)而已,沒有遞歸
    $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;
    }
    //顯示樹狀結(jié)構(gòu)
    foreach($arr_list as $a)
    {
      echo str_repeat('--', $a['depath']) . $a['title'] . '<br />';
    }
  }
  /**
   * 
   * 插入操作很簡單找到其父節(jié)點(diǎn),之后把左值和右值大于父節(jié)點(diǎn)左值的節(jié)點(diǎn)的左右值加上2,之后再插入本節(jié)點(diǎn),左右值分別為父節(jié)點(diǎn)左值加一和加二
   */
  public function add()
  {
    //獲取到父級分類的id
    $parent_id = 10;
    $parent_category = $this->db->where('id', $parent_id)->get('category')->row_array();
    //1.左值和右值大于父節(jié)點(diǎn)左值的節(jié)點(diǎn)的左右值加上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.插入新的節(jié)點(diǎn)
    $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.得到刪除的節(jié)點(diǎn),將右值減去左值然后加1,得到值$width = $rgt - $lft + 1;
   * //2.刪除左右值之間的所有節(jié)點(diǎn)
   * //3.修改條件為大于本節(jié)點(diǎn)右值的所有節(jié)點(diǎn),操作為把他們的左右值都減去$width
   */
  public function delete()
  {
    //通過分類id獲取分類
    $id = 3;
    $category = $this->db->where('id', $id)->get('category')->row_array();
    //計(jì)算$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.修改其它節(jié)點(diǎn)的值
    $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程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)抽象工廠模式

    學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)抽象工廠模式

    這篇文章主要介紹了php設(shè)計(jì)模式中的抽象工廠模式,使用php實(shí)現(xiàn)抽象工廠模式,感興趣的小伙伴們可以參考一下
    2015-12-12
  • php函數(shù)之子字符串替換&#65279; str_replace

    php函數(shù)之子字符串替換&#65279; str_replace

    php函數(shù)str_replace: 返回一個字符串或者數(shù)組。該字符串或數(shù)組是將 subject 中全部的 search 都被 replace 替換之后的結(jié)果。
    2011-03-03
  • PHP 存儲文本換行實(shí)現(xiàn)方法

    PHP 存儲文本換行實(shí)現(xiàn)方法

    在文本存儲時使用\n如果發(fā)現(xiàn)沒有效果, 這時可以使用\r\n就可以了,希望對有需要的朋友有所幫助。
    2010-01-01
  • 解析如何去掉CodeIgniter URL中的index.php

    解析如何去掉CodeIgniter URL中的index.php

    本篇文章是對如何去掉CodeIgniter URL中index.php的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP中md5()函數(shù)的用法講解

    PHP中md5()函數(shù)的用法講解

    今天小編就為大家分享一篇關(guān)于PHP中md5()函數(shù)的用法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • php 用checkbox一次性刪除多條記錄的方法

    php 用checkbox一次性刪除多條記錄的方法

    一次性刪除多條記錄,對于比較多的信息,如果沒有批量刪除功能是非常麻煩的。這樣就方便多了。
    2010-02-02
  • PHP中單引號和雙引號的區(qū)別詳解

    PHP中單引號和雙引號的區(qū)別詳解

    看好多代碼有時候用單引號或雙引號實(shí)現(xiàn)包含字符串的內(nèi)容,其實(shí)簡單個概括下雙引號中的變量可以解析,單引號就是絕對的字符串,下面這篇文章主要給大家介紹了關(guān)于PHP中單引號和雙引號區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • php下將XML轉(zhuǎn)換為數(shù)組

    php下將XML轉(zhuǎn)換為數(shù)組

    PHP XML To Array,將XML轉(zhuǎn)換為數(shù)組,需要的朋友可以參考下。
    2010-01-01
  • php tpl模板引擎定義與使用示例

    php tpl模板引擎定義與使用示例

    這篇文章主要介紹了php tpl模板引擎定義與使用,結(jié)合實(shí)例形式分析了php模板引擎的定義與使用相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • php中adodbzip類實(shí)例

    php中adodbzip類實(shí)例

    這篇文章主要介紹了php中adodbzip類,以實(shí)例形式詳細(xì)講述了adodbzip類文件的實(shí)現(xiàn)方法與使用技巧,注釋中包含詳盡的功能說明,非常具有實(shí)用價值,需要的朋友可以參考下
    2014-12-12

最新評論

葫芦岛市| 绥棱县| 吴忠市| 陕西省| 长武县| 抚松县| 虞城县| 东乡县| 土默特右旗| 平顶山市| 绵阳市| 蓝田县| 始兴县| 公安县| 呼伦贝尔市| 镇江市| 偏关县| 襄城县| 册亨县| 阿勒泰市| 长葛市| 石屏县| 崇州市| 繁峙县| 锡林浩特市| 罗山县| 临江市| 宝应县| 威海市| 海晏县| 宁城县| 吉木萨尔县| 民乐县| 宕昌县| 沙坪坝区| 阆中市| 兴城市| 西吉县| 汤阴县| 肇东市| 日喀则市|