国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php通過前序遍歷樹實現無需遞歸的無限極分類

2024-05-04 23:37:40
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了php通過前序遍歷樹實現無需遞歸的無限極分類,涉及基于CI框架針對數據庫的查詢與遍歷操作,具有一定參考借鑒價值,需要的朋友可以參考下

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

大家通常都是使用遞歸實現無限極分類都知道遞歸效率很低,下面介紹一種改進的前序遍歷樹算法,不適用遞歸實現無限極分類,在大數據量實現樹狀層級結構的時候效率更高。

sql代碼如下:

 

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

php代碼如下:

 

 
  1. <?php 
  2. /** 
  3. * 純屬測試 
  4.  
  5. * @author Mckee 
  6. * @link http://www.phpddt.com 
  7. */ 
  8. class Category extends CI_Controller { 
  9. public function __construct() 
  10. parent::__construct(); 
  11. $this->load->database(); 
  12. public function view() 
  13. $lists = $this->db->order_by('lft''asc')->get('category')->result_array(); 
  14. //相鄰的兩條記錄的右值第一條的右值比第二條的大那么就是他的父類 
  15. //我們用一個數組來存儲上一條記錄的右值,再把它和本條記錄的右值比較,如果前者比后者小,說明不是父子關系,就用array_pop彈出數組,否則就保留 
  16. //兩個循環而已,沒有遞歸 
  17. $parent = array(); 
  18. $arr_list = array(); 
  19. foreach($lists as $item){ 
  20. if(count($parent)){ 
  21. while (count($parent) -1 > 0 && $parent[count($parent) -1]['rgt'] < $item['rgt']){ 
  22. array_pop($parent); 
  23. }  
  24. $item['depath'] = count($parent); 
  25. $parent[] = $item; 
  26. $arr_list[]= $item; 
  27. //顯示樹狀結構 
  28. foreach($arr_list as $a) 
  29. echo str_repeat('--', $a['depath']) . $a['title'] . '<br />'
  30. /** 
  31.  
  32. * 插入操作很簡單找到其父節點,之后把左值和右值大于父節點左值的節點的左右值加上2,之后再插入本節點,左右值分別為父節點左值加一和加二 
  33. */ 
  34. public function add() 
  35. //獲取到父級分類的id 
  36. $parent_id = 10; 
  37. $parent_category = $this->db->where('id', $parent_id)->get('category')->row_array(); 
  38. //1.左值和右值大于父節點左值的節點的左右值加上2 
  39. $this->db->set('lft''lft + 2', FALSE)->where(array('lft >' => $parent_category['lft']))->update('category'); 
  40. $this->db->set('rgt''rgt + 2', FALSE)->where(array('rgt >' => $parent_category['lft']))->update('category'); 
  41. //2.插入新的節點 
  42. $this->db->insert('category', array( 
  43. 'title' => '新的分類的子分類'
  44. 'lft' => $parent_category['lft'] + 1, 
  45. 'rgt' => $parent_category['lft'] + 2, 
  46. 'order' => 0, 
  47. 'create_time' => time() 
  48. )); 
  49. echo 'add success'
  50. /** 
  51. * 刪除 
  52.  
  53. * //1.得到刪除的節點,將右值減去左值然后加1,得到值$width = $rgt - $lft + 1; 
  54. * //2.刪除左右值之間的所有節點 
  55. * //3.修改條件為大于本節點右值的所有節點,操作為把他們的左右值都減去$width 
  56. */ 
  57. public function delete() 
  58. //通過分類id獲取分類 
  59. $id = 3; 
  60. $category = $this->db->where('id', $id)->get('category')->row_array(); 
  61. //計算$width 
  62. $width = $category['rgt'] - $category['lft'] + 1; 
  63. //1.刪除該條分類 
  64. $this->db->delete('category', array('id' => $id)); 
  65. //2.刪除左右值之間的所有分類 
  66. $this->db->delete('category', array('lft >' => $category['lft'], 'lft <' => $category['rgt'])); 
  67. //3.修改其它節點的值 
  68. $this->db->set('lft'"lft - {$width}", FALSE)->where(array('lft >' => $category['rgt']))->update('category'); 
  69. $this->db->set('rgt'"rgt - {$width}", FALSE)->where(array('rgt >' => $category['rgt']))->update('category'); 
  70. echo 'delete success'
  71. //編輯, 
  72. public function edit() 
  73. //不用說了, 直接通過id編輯 
  74. $id = 2; 
  75. $this->db->update('category', array( 
  76. 'title' => '編輯后的分類' 
  77. ), array( 
  78. 'id' => $id 
  79. )); 
  80. echo 'edit success'

希望本文所述對大家的php程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福建省| 大悟县| 峡江县| 准格尔旗| 桦甸市| 深水埗区| 湘乡市| 方正县| 马鞍山市| 肥东县| 巴彦县| 静乐县| 平塘县| 松溪县| 南宫市| 荆州市| 常宁市| 镇赉县| 余姚市| 虞城县| 台江县| 闵行区| 讷河市| 南和县| 都江堰市| 天台县| 玛曲县| 龙海市| 刚察县| 桂东县| 佛坪县| 三门县| 武山县| 茌平县| 海口市| 四川省| 怀化市| 镇沅| 长沙市| 平定县| 谢通门县|