php无需递归实现无限极分类树
php无需递归如何实现无限极分类树?本文主要介绍了php通过前序遍历树实现无需递归的无限极分类,涉及基于CI框架针对数据库的查询与遍历操作。希望对大家使用分类树有所帮助。
本文实例讲述了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'; } }
相关推荐:
Atas ialah kandungan terperinci php无需递归实现无限极分类树. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.
