巅云智能建站平台搭建版(创业流派版)火爆上线,毕生受权!新增:文章智能收罗+全站真静态打包+城市分站+智能小法式+不法词过滤+H5自顺应+智能链词等功效功效概况
建站专提News

php完成无穷级分类(递归体例)

一佰互联网站开辟设想(www.taishanly.com) 宣布日期 2020-04-27 10:45:01 阅读数: 100

信任良多学php的良多小火伴城市测验考试做一个网上商城作为晋升本身手艺的一种路子。各类对商品分类,商品名之类的操纵应当是驾轻就熟,那末就能够测验考试下无穷级分类列表的建造了。

到网上一搜php无穷极分类,良多,但良多多少都是一个,并且,写的很乱,代码良多,让咱们怎样进修嘛,那些都不靠谱,仍是本身捣鼓捣鼓无穷极分类了。

  甚么是无穷级分类?

  无穷级分类是一种分类技能,比方局部构造,文章分类,学科分类等经常操纵到无穷级分类,将其简略懂得成份类就行了。实在咱们细心想一下,糊口中的分类的确太多了,衣服能够分为男装和女装,也能够分为上衣和裤子,也能够按照春秋段分类。分类无处不在,分类显得“无穷”。我这里就不说无穷分类的须要性了。

  无穷级分类道理简介

  无穷分类看似"高峻上",现实上道理是很是简略的 。无穷分类不只仅须要代码的奇妙性,也要依靠数据库设想的合感性。要知足无穷级分类,数据库须要有两个必须的字段,id,pid。id用来标识本身,而pid则是用来标明父级id。也便是说,每个分类记实不只描写了本身,还描写了与其关怀最为慎密的另外一个id。看似庞杂的任务被如许一个小技能处理了。

  闲话未几说,该揭示本文的实例了。

  作为一个狂热海贼迷,这篇的实例我就以《海贼王》人物构造做案例。

  数据库筹办: 

  建表onepiece:

create table onepiece(  id int auto_increment,  pid int not null,  name varchar(225) not null,  primary key(id));

   拔出测试数据:

insert onepiece values  (1,0,"水兵"),  (2,0,"海贼"),  (3,0,"反动军"),  (4,1,"青雉"),  (5,1,"赤犬"),  (6,1,"黄猿"),  (7,2,"四皇"),  (8,2,"七武海"),  (9,2,"草帽海贼团"),  (10,9,"索隆"),  (11,7,"香克斯"),  (12,8,"多弗朗明哥"),  (13,8,"克洛克达尔");

  这里仍是科普下海贼王外面的设定:天下分为三大营垒:水兵,海贼,反动军。水兵有上将:青雉,赤犬,黄猿。海贼有:四皇,七武海,草帽海贼团。四皇有香克斯,七武海有多弗朗明哥,克洛克达尔,草帽海贼团有索隆。(打个告白:海贼王真的很都雅)。

  终究目标:

  咱们明天建造的是两种情势的无穷级分类情势,一种是下拉列表式,一种则是导航Link式的。间接上成果图了:

下拉列表式

导航Link式

  实例代码:

  我封装了一个Unlimited类,用来挪用diaplayList()揭示下拉列表情势,挪用diaplayLink揭示导航Link分类。也能够增添(addNodes())和删除(deleteNodes)分类。

<?phpclass Unlimited{  protected $mysqli;  public function __construct($config){    $this->mysqli=new mysqli($config["host"],$config["user"],$config["pwd"]);    $this->mysqli->select_db($config["db"]);    $this->mysqli->set_charset("utf8");    if ($this->mysqli->connect_errno) {      echo $this->mysqli->connect_error;    }  }    private function getList($pid=0,&$result=array(),$spac=0){    $spac=$spac+2;    $sql="select * from onepiece where pid={$pid}";    $rs=$this->mysqli->query($sql);    while($row=$rs->fetch_assoc()) {      $row["name"]=str_repeat("  ",$spac).$row["name"];      $result[]=$row;      $this->getList($row["id"],$result,$spac);          }    return $result;  }  /**   * 揭示下拉列表式分类   * @return [type]    */  public function displayList(){    $rs=$this->getList();    $str="<select name="cate">";    foreach ($rs as $key => $val) {      $str.="<option >{$val["name"]}</option>";    }    $str.="</select>";    return $str;  }  private function getLink($cid,&$result=array()){    $sql="select * from onepiece where id={$cid}";    $rs=$this->mysqli->query($sql);    if($row=$rs->fetch_assoc()){      $result[]=$row;      $this->getLink($row["pid"],$result);    }    return array_reverse($result);  }  /**   * 揭示导航Link   * @param [type] $cid [description]   * @return [type]   [description]   */  public function displayLink($cid){    $rs=$this->getLink($cid);    $str="";    foreach ($rs as $val) {      $str.="<a href="">{$val["name"]}</a>>";    }    return $str;  }  /**   * 增添分类   * @param [type] $pid 父类id   * @param [type] $name 本类名   */  public function addNodes($pid,$name){    $sql="insert into onepiece values("",{$pid},"".$name."")";    if($this->mysqli->query($sql)){      return true;    }  }  /**   * 删除分类   * @param [type] $id 本类id   * @return [type]      */  public function deleteNodes($id){    $sql="select * from onepiece where pid ={$id}";    $rs=$this->mysqli->query($sql);    if($row=$rs->fetch_assoc()){      $mes="另有子元素,请勿删除";    }else{      $sql="delete from onepiece where id={$id}";      if($this->mysqli->query($sql)){        $mes="删除胜利";      }    }    return $mes;  }}

  类中函数首要采用了递归函数的体例,若是懂得深入懂得递归函数,其他的局部也就瓜熟蒂落了。我会在前面的局部具体先容完成递归函数的三种体例。

 咱们再来看一个实例:

起首成立分类信息表:

CREATE TABLE IF NOT EXISTS `category` (  `categoryId` smallint(5) unsigned NOT NULL AUTO_INCREMENT,  `parentId` smallint(5) unsigned NOT NULL DEFAULT "0",  `categoryName` varchar(50) NOT NULL,  PRIMARY KEY (`categoryId`) ) ; 

拔出多少数据:

INSERT INTO `category` (`categoryId`, `parentId`, `categoryName`) VALUES (1, 0, "php"), (2, 0, "java"), (3, 0, "c/c++"), (4, 1, "php根本"), (5, 1, "php开源材料"), (6, 1, "php框架"), (7, 2, "java Se"), (8, 2, "java EE"), (9, 2, "java Me"), (10, 3, "c/c++根本编程"), (11, 3, "c/c++体系开辟"), (12, 3, "c嵌入式编程"), (13, 3, "c++操纵开辟"), (14, 13, "c++桌面操纵开辟"), (15, 13, "c++游戏开辟"); 

上面是php代码:

<?php /* php无穷极分类 */  //获得某分类的间接子分类 function getSons($categorys,$catId=0){   $sons=array();   foreach($categorys as $item){     if($item["parentId"]==$catId)       $sons[]=$item;   }   return $sons; }  //获得某个分类的一切子分类 function getSubs($categorys,$catId=0,$level=1){   $subs=array();   foreach($categorys as $item){     if($item["parentId"]==$catId){       $item["level"]=$level;       $subs[]=$item;       $subs=array_merge($subs,getSubs($categorys,$item["categoryId"],$level+1));            }          }   return $subs; }  //获得某个分类的一切父分类 //体例一,递归 function getParents($categorys,$catId){   $tree=array();   foreach($categorys as $item){     if($item["categoryId"]==$catId){       if($item["parentId"]>0)         $tree=array_merge($tree,getParents($categorys,$item["parentId"]));       $tree[]=$item;        break;      }   }   return $tree; }  //体例二,迭代 function getParents2($categorys,$catId){   $tree=array();   while($catId != 0){     foreach($categorys as $item){       if($item["categoryId"]==$catId){         $tree[]=$item;         $catId=$item["parentId"];         break;        }     }   }   return $tree; } //测试 局部 $pdo=new PDO("mysql:host=localhost;dbname=test","root","8888"); $stmt=$pdo->query("select * from category order by categoryId"); $categorys=$stmt->fetchAll(PDO::FETCH_ASSOC);  $result=getSons($categorys,1); foreach($result as $item)   echo $item["categoryName"]."<br>"; echo "<hr>";  $result=getSubs($categorys,0); foreach($result as $item)   echo str_repeat(" ",$item["level"]).$item["categoryName"]."<br>"; echo "<hr>";  $result=getParents($categorys,7); foreach($result as $item)   echo $item["categoryName"]." >> "; echo "<hr>";  $result=getParents2($categorys,15); foreach($result as $item)   echo $item["categoryName"]." >> "; ?> 

看下终究成果吧

固然本文先容的是操纵递返来完成的无穷级分类,但现实上,并不保举大师这么做,大师晓得分类多了,递归效力也就低了,本文这里仅仅是为了让大师更好的懂得递归才这么做的。

一佰互联是天下着名建站品牌办事商,咱们有九年、网站建造、网页设想、php开辟和域名注册及假造主机办事经历,供给的办事更是天下着名。比来几年来还整合团队上风自立开辟了可视化多用户”“3.0平台版,拖拽排版网站建造设想,轻松完成pc站、手机微网站、小法式、APP一体化全网营销网站扶植 ,已胜利的为天下上百家收集公司供给自助建站平台搭建办事。更多资讯:tags标签

相干消息more

23
04月
Linux下检查节制情况变量的体例

检查情况变量检查某一情况变量:比方咱们须要检查HOME这个情况变量,咱们能够在shell下间接输出echo $HOME,咱们能够把一切的情况... >>概况

04
08月
北京网站建造为甚么夸大建站定制?建站哪些方面

企业遴选好的北京网站建造任务室的目地便是想把本身企业的网站建造的更加精美,能够在互联网上获得 更好的流量,更有用的推行本身企业的商品和品牌形... >>概况

16
04月
专业网站扶植-text-indent属性兼容

text-indent属性兼容IE和火狐阅读器的体例,小编亲测可用比来老是但愿将比来的做的网站对搜刮引擎友爱,text-indent: -9... >>概况

18
05月
京东商城万万美金收买彻夜旅店特价,在为收买新

window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":... >>概况

高端网站扶植

美工统筹SEO,为企业电子商务营销助力!

德律风:

023-85725751
建站

产物

域名注册 假造主机 云办事器 企业邮局
智能建站 APP打包 微站/小法式 创业平台
网站推行 媒体营销 智能收罗 AI机械人
400德律风 短信营销 店销机械人
私家定制 流派网站