个人网页制作_制作网页完整步骤_网页展示模板_如何制作网站和网页_网页怎么做
当前位置:建站首页 > 新闻资讯 > 常见问题 >

上下值完成PHP无尽归类事例

发表日期:2021-04-03 21:00文章编辑:jianzhan浏览次数: 标签:    

上下值完成PHP无尽归类事例 公布:smiling 来源于: PHP粉絲网 加上 访问: 评价:0

无尽归类在频道归类中大家常常用到来到,今日看来一个应用上下值完成PHP无尽归类事例了,期待这一事例能够对诸位产生协助.

一、db sql句子


create table tree(   id int(10) not null primary key auto_increment,   name varchar(255) not null,   lft int(10) not null default 0,   rgt int(10) not null default 0,   status int(1) not null default 0,   index lft (`lft`), --   index rgt (`rgt`),   index status(`status`)  )charset utf8;  insert into tree value (null, Food ,1,18,0);  insert into tree value (null, Fruit ,2,11,0);  insert into tree value (null, Red ,3,6,0);  insert into tree value (null, Cherry ,4,5,0);  insert into tree value (null, Yellow ,7,10,0);  insert into tree value (null, Banana ,8,9,0);  insert into tree value (null, Meat ,12,17,0);  insert into tree value (null, Beef ,13,14,0);  insert into tree value (null, Pork ,15,16,0); 
 +------------------------------+   2 Fruit 11 12 Meat 17   +-------------+ +------------+  3 Red 6 7 Yellow 10 13 Beef 14 15 Pork 16  4 Cherry 5 8 Banana 9  descendants = (right   left - 1) / 2  */  /**   *用以移动一个连接点(包含子连接点)   *@param array $pdata = array( id = 主键, root = 名字) 二选一 父连接点(为空时插进较大的父连接点)   *@param array $ndata = array( id = 主键, root = 名字) 二选一 下一个弟兄连接点(沒有弟兄的情况下也不用)   *@param array $cdata = array( id = 主键, root = 名字) 二选一 当今待移动的连接点   */  function move_tree_all($pdata=array(),$ndata=array(),$cdata=array()) {   $cid = $cdata[ id ] ?&al($cdata[ id ]) :  ;   $croot = $cdata[ root ];   if(!$cid   !$croot) return;   //需自加分辨   //1、cdata不可以为顶尖   //2、cdata不可以比$pdata级别高   $adata = get_tree_all($cdata); //获得当今移动连接点的全部连接点   delete_tree_all($cdata,1); //逻辑性删掉当今移动连接点的全部连接点   foreach($adata as $k =  $val) {   if($k != 0) {   $pdata = array( root = $val[ parent ]);   insert_tree($pdata, ,$val[ name ],1);   } else { //first   insert_tree($pdata,$ndata,$val[ name ],1);   }   }  }  /**   *用以移动一个连接点(不包含子连接点)   *@param array $pdata = array( id = 主键, root = 名字) 二选一 父连接点(为空时插进较大的父连接点)   *@param array $ndata = array( id = 主键, root = 名字) 二选一 下一个弟兄连接点(沒有弟兄的情况下也不用)   *@param array $cdata = array( id = 主键, root = 名字) 二选一 当今待移动的连接点   */  function move_tree_item($pdata=array(),$ndata=array(),$cdata=array()) {   $cid = $cdata[ id ] ?&al($cdata[ id ]) :  ;   $croot = $cdata[ root ];   if(!$cid   !$croot) return;   //需自加分辨   //1、cdata不可以为顶尖   if(!$croot) {   $sql =  SELECT name from tree where id = $cid ;   $result = mysql_query($sql);   $row = mysql_fetch_assoc($result);   $croot = $row[ name ];   unset($sql);   }   delete_tree_item($cdata,1);   insert_tree($pdata,$ndata,$croot,1);  }  /**   *用以插进一个连接点   *@param array $pdata = array( id = 主键, root = 名字) 二选一 父连接点(为空时插进较大的父连接点)   *@param array $ndata = array( id = 主键, root = 名字) 二选一 下一个弟兄连接点(沒有弟兄的情况下也不用)   *@param string $name string 新插进的名字   *@param int $update 默认设置为空,为1时升级插进   */  function insert_tree($pdata=array(),$ndata=array(),$name,$update= ) {   if(!$name) return;   $pid = $pdata[ id ] ?&al($pdata[ id ]) :  ;   $proot = $pdata[ root ];   $nid = $ndata[ id ] ?&al($ndata[ id ]) :  ;   $nroot = $ndata[ root ];   //有父无兄(最少的子连接点,父连接点的最终一个孩子)   if(($pid || $proot)   !($nid || $nroot)) {   $sql = $pid ?  SELECT lft, rgt FROM tree WHERE id =  {$pid}  :  SELECT lft, rgt FROM tree WHERE name =  {$proot} ;   $result = mysql_query($sql);   $row = mysql_fetch_assoc($result);   unset($sql);   //新连接点   $lft = $row[ rgt ];   $rgt = $lft+1;   if(!$update) {   $sql =  insert into tree values (null, {$name} ,$lft,$rgt,0); ;   $sql1 =  update tree set rgt = rgt+2 where rgt  = {$row[ rgt ]} ;   $sql2 =  update tree set lft = lft+2 where lft  = {$row[ rgt ]} ;   } else {   $sql =  update tree set lft=$lft,rgt=$rgt,status=0 where name = {$name} ;   $sql1 =  update tree set rgt = rgt+2 where status =0 and rgt  = {$row[ rgt ]} ;   $sql2 =  update tree set lft = lft+2 where status =0 and lft  = {$row[ rgt ]} ;   }     mysql_query($sql1);   mysql_query($sql2);   mysql_query($sql); //last add new data   }   //有父有兄   if(($pid || $proot)   ($nid || $nroot)) {   $sql = $nid ?  SELECT lft, rgt FROM tree WHERE id =  {$nid}  :  SELECT lft, rgt FROM tree WHERE name =  {$nroot} ;   $result = mysql_query($sql);   $row = mysql_fetch_assoc($result);   unset($sql);   //新连接点   $lft = $row[ lft ];   $rgt = $lft+1;   if(!$update) {   $sql =  insert into tree values (null, {$name} ,$lft,$rgt,0); ;   $sql1 =  update tree set rgt = rgt+2 where rgt  = {$row[ lft ;   $sql2 =  update tree set lft = lft+2 where lft  = {$row[ lft ;   } else {   $sql =  update tree set lft=$lft,rgt=$rgt,status=0 where name = {$name} ;   $sql1 =  update tree set rgt = rgt+2 where status = 0 and rgt  = {$row[ lft ;   $sql2 =  update tree set lft = lft+2 where status = 0 and lft  = {$row[ lft ;   }   mysql_query($sql1);   mysql_query($sql2);   mysql_query($sql); //last add new data   }   //无父无兄(巨头)   if(!($pid || $proot)   !($nid || $nroot)) {   $sql =  SELECT max(`rgt`) as rgt FROM tree; ;   $result = mysql_query($sql);   $row = mysql_fetch_assoc($result);   unset($sql);   //新连接点   $lft = 1;   $rgt = $row[ rgt ]+2;   if(!$update) {   $sql =  insert into tree values (null, {$name} ,$lft,$rgt,0); ;   $sql1 =  update tree set rgt = rgt+1 ;   $sql2 =  update tree set lft = lft+1 ;   } else {   $sql =  update tree set lft=$lft,rgt=$rgt,status=0 where name = {$name} ;   $sql1 =  update tree set rgt = rgt+1 where status = 0 ;   $sql2 =  update tree set lft = lft+1 where status = 0 ;   }     mysql_query($sql1);   mysql_query($sql2);   mysql_query($sql); //last add new data   }    }  /**   *用以删掉一个连接点(包含子连接点)   *@param array $data = array( id = 主键, root = 名字) 二选一   *@param int $update 默认设置为空,为1时逻辑性删掉   */  function delete_tree_all($data,$update= ) {   $id = $data[ id ] ?&al($data[ id ]) :  ;   $root = $data[ root ];   if(!$id   !$root) return;   $sql = $id ?  SELECT lft, rgt FROM tree WHERE id =  {$id}  :  SELECT lft, rgt FROM tree WHERE name =  {$root} ;   $result = mysql_query($sql);   $row = mysql_fetch_assoc($result);   unset($sql);   $middle = $row[ rgt ]-$row[ lft ]+1;   if(!$update) {   $sql =  delete from tree where lft BETWEEN   . $row[ lft ] .   AND   . $row[ rgt ] .    $sql1 =  update tree set rgt = rgt-{$middle} where rgt   {$row[ rgt ]} ;   $sql2 =  update tree set lft = lft-{$middle} where lft   {$row[ rgt ]} ;   } else {   $sql =  update tree set status = 1 where lft BETWEEN   . $row[ lft ] .   AND   . $row[ rgt ] .    $sql1 =  update tree set rgt = rgt-{$middle} where status=0 and rgt   {$row[ rgt ]} ;   $sql2 =  update tree set lft = lft-{$middle} where status=0 and lft   {$row[ rgt ]} ;   }     mysql_query($sql);   mysql_query($sql1);   mysql_query($sql2);  }  /**   *用以删掉一个连接点(不包含子连接点)   *@param array $data = array( id = 主键, root = 名字) 二选一   *@param int $update 默认设置为空,为1时逻辑性删掉   */  function delete_tree_item($data,$update= ) {   $id = $data[ id ] ?&al($data[ id ]) :  ;   $root = $data[ root ];   if(!$id   !$root) return;   $sql = $id ?  SELECT id,lft, rgt FROM tree WHERE id =  {$id}  :  SELECT id,lft, rgt FROM tree WHERE name =  {$root} ;   $result = mysql_query($sql);   $row = mysql_fetch_assoc($result);   unset($sql);   if(!$update) {   $sql =  delete from tree where id = {$row[ id ;   $sql1 =  update tree set rgt = rgt-1,lft = lft -1 where lft   {$row[ lft ]} and rgt   {$row[ rgt ]} ;   $sql2 =  update tree set lft = lft-2 where lft   {$row[ rgt ]} ;   $sql3 =  update tree set rgt = rgt-2 where rgt   {$row[ rgt ]} ;   } else {   $sql =  update tree set status = 1 where id = {$row[ id ;   $sql1 =  update tree set rgt = rgt-1,lft = lft -1 where status = 0 and lft   {$row[ lft ]} and rgt   {$row[ rgt ]} ;   $sql2 =  update tree set lft = lft-2 where status = 0 and lft   {$row[ rgt ]} ;   $sql3 =  update tree set rgt = rgt-2 where status = 0 and rgt   {$row[ rgt ]} ;   }     mysql_query($sql);   mysql_query($sql1);   //can do or not do just right,but not do load empty 2 number in middle   mysql_query($sql2);   mysql_query($sql3);  }  /**   *用以获得全部的连接点   *@param array $data = array( id = 主键, root = 名字) 二选一   */  function get_tree_all($data) {   $id = $data[ id ] ?&al($data[ id ]) :  ;   $root = $data[ root ];   if(!$id   !$root) return;   $sql = $id ?  SELECT lft, rgt FROM tree WHERE id =  {$id}  :  SELECT lft, rgt FROM tree WHERE name =  {$root} ;   $result = mysql_query($sql);   $row = mysql_fetch_assoc($result);   $adata = array(); //全部数据信息   $right = array(); //计数   $prev = array();   $result = mysql_query( SELECT id,name, lft, rgt FROM tree WHERE lft BETWEEN   . $row[ lft ] .   AND   . $row[ rgt ] .  ORDER BY lft ASC ;    while ($row = mysql_fetch_assoc($result)) {   if (count($right)   0) {   while ($right[count($right) - 1]   $row[ rgt ]) { // 查验大家是不是应当将连接点移除堆栈   array_pop($right);   array_pop($prev);   }   }   $parent = $prev ? end($prev) :  ;   $adata[] = array( id = $row[ id ], name = $row[ name ], level = count($right), parent = $parent);   $right[] = $row[ rgt ];   $prev[] = $row[ name ];   }   return $adata;  }  /**   *用以展现归类   *@param array $data = array( id = 主键, root = 名字) 二选一   */  function display_tree($data) {   $id = $data[ id ] ?&al($data[ id ]) :  ;   $root = $data[ root ];   if(!$id   !$root) return;   $sql = $id ?  SELECT lft, rgt FROM tree WHERE id =  {$id}  :  SELECT lft, rgt FROM tree WHERE name =  {$root} ;   $result = mysql_query($sql);   $row = mysql_fetch_assoc($result);   $right = array();   $result = mysql_query( SELECT name, lft, rgt FROM tree WHERE lft BETWEEN   . $row[ lft ] .   AND   . $row[ rgt ] .  ORDER BY lft ASC ;    while ($row = mysql_fetch_assoc($result)) {   if (count($right)   0) { // 查验大家是不是应当将连接点移除堆栈   while ($right[count($right) - 1]   $row[ rgt ]) {   array_pop($right);   }   }   echo str_repeat(   ,count($right)) . $row[ name ] .  \n ;   $right[] = $row[ rgt ];   }  }  mysql_connect( localhost , root , ) or die( connect error );  mysql_select_db( test ) or die( database error );  mysql_query( set names utf8 );  display_tree(array( root = Food ));  //display_tree(array( root = bigboss   //move_tree_all($pdata=array( root = Fruit ),$ndata=array( root = Red ),$cdata=array( root = Meat   //move_tree_all( , ,$cdata=array( root = Meat   //move_tree_item( , ,array( root = Red   //move_tree_item(array( root = Red ),array( root = Cherry ),array( root = Fruit  //  //delete_tree_all(array( root = Yellow   //delete_tree_all(array( root = Meat   //delete_tree_item(array( root = Meat   //insert_tree( , , bigboss   //insert_tree(array( root = Red ), , dalao   //insert_tree(array( root = Red ),array( root = Cherry ), baddalao   //insert_tree(array( root = Fruit ),array( root = Red ), Redbother   display_tree(array( root = Food )); 
php实例教程网——出示php实例教程免费下载資源  Powered by php粉絲网 2010-2015  网站协作
返回列表
相关新闻

电商网站完成建设后-他人的买东西节手机微信主

还有十几天,又要到了一年一度的双十一,相信很多商家已经开始为这一次节日想了好几个“...

日期:2021-04-01 浏览次数:134

有关NAT三种币表明,及T币在线充值留意事项

一,T币在线充值留意事项:1.付款宝服务平台在线充值方法。适用付款宝账户余额、账户余额...

日期:2021-03-14 浏览次数:166

细致到秀发丝,Adobe深层抠图方式的完成来啦!

设备的心报导...

日期:2021-03-05 浏览次数:77

过路人照下的热巴颜值仍然线上,与未修图的区

过路人照下的热巴颜值仍然线上,与未修图的区别不大,有图有实情...

日期:2021-01-19 浏览次数:134

公司网站选用模版建网站,究竟值不值得得信任

信息内容化的今日,愈来愈多的中小公司观念到1个自身的官方网站对公司拥有不能或缺的功效...

日期:2021-01-19 浏览次数:140

当年自称值8000万的抠图女神杨颖,目前无戏可拍

想不到,仅仅4年,那个以前笑着说的我身价8干万的女孩,如今的电影酬金还不到1干万,可是...

日期:2021-01-19 浏览次数:92