好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHP生成树状结构的方法

本文讲解PHP生成树状结构的方法

这个类不是我写的 只添加了getAll()函数  php生成一个树,可以用于产品分类  不知道遍历写的是否优化,如果你有请分享一下吧 -.-!

运行效果如下图所示:

实现代码如下:

<?php class Tree {  public $data=array();  public $cateArray=array();  public $res=array();  function Tree()  {  }  function setNode ($id, $parent, $value)  {   $parent = $parent?$parent:0;   $this->data[$id] = $value;   //print_r($this->data);   //echo "\r\n";   $this->cateArray[$id] = $parent; //节点数组   //print_r($this->cateArray);  }  function getChildsTree($id=0)  {   $childs=array();   foreach ($this->cateArray as $child=>$parent)   {    if ($parent==$id)    {     $childs[$child]=$this->getChildsTree($child);    }   }   print_r($childs)."/r/n";   return $childs;  }  function getParentsTree($id=0)  {   $parents=array();   foreach ($this->cateArray as $child=>$parent)   {    if ($child ==$id)    {     $parents[$parent]=$this->getParentsTree($parent);    }   }   print_r($parents)."/r/n";   return $parents;  }  function getChilds($id=0)  {   $childArray=array();   $childs=$this->getChild($id);   foreach ($childs as $child)   {    $childArray[]=$child;    $childArray=array_merge($childArray,$this->getChilds($child));   }   return $childArray;  }  function getChild($id)  {   $childs=array();   foreach ($this->cateArray as $child=>$parent)   {   if ($parent==$id)   {    $childs[$child]=$child;   }   }   return $childs;  }  function getParents($id)  {   $parentArray=array();   $parents=$this->getParent($id);   foreach ($parents as $parent)   {    $parentArray[]=$parent;    $parentArray=array_merge($parentArray,$this->getParents($parent));   }   return $parentArray;  }  function getParent($id)  {   $parents=array();   foreach ($this->cateArray as $child=>$parent)   {    if ($child==$id)    {    $parents[$parent]=$parent;    }   }   return $parents;  }  //单线获取父节点  function getNodeLever($id)  {   $parents=array();   if (key_exists($this->cateArray[$id],$this->cateArray))   {    $parents[]=$this->cateArray[$id];    $parents=array_merge($parents,$this->getNodeLever($this->cateArray[$id]));   }   return $parents;  }  function getLayer($id,$preStr='|-')  {   return str_repeat($preStr,count($this->getNodeLever($id)));  }  function getValue ($id)  {   return $this->data[$id];  } // end func  //获取所有节点数据生成树  function getAll($id=0,$str="|-"){   if($id!=0){    $str=$str."|-";   }   //遍历所有数组检查parent是否有id   foreach($this->cateArray as $child=>$parent){    //检查是否有相等的ID    if($parent==$id){     $this->res[$child]=$str.$this->getValue($child);     $this->getAll($child,$str);    }    //$this->res[$child]=$child.$str.$this->getValue($child);   }  } } //构造树 //setNode ($id, $parent, $value) $tree = new Tree(); $tree->setNode("1","","电器"); $tree->setNode("2","","服装"); $tree->setNode("3","1","电脑"); $tree->setNode("4","1","家电"); $tree->setNode("5","2","男装"); $tree->setNode("6","2","女装"); $tree->setNode("7","3","笔记本"); $tree->setNode("8","3","台式机"); $tree->setNode("9","7","惠普"); $tree->setNode("10","7","戴尔"); $tree->setNode("11","8","火星人"); $tree->setNode("12","5","西装"); $tree->setNode("13","6","上衣"); $tree->setNode("14","9","惠普-N90"); $tree->setNode("15","9","惠普-N91"); $tree->setNode("16","10","戴尔A11"); $tree->setNode("17","10","戴尔A12"); $tree->setNode("18","10","戴尔A13"); $tree->setNode("19","6","裤子 "); $tree->setNode("20","13","长袖"); $tree->setNode("21","13","短袖"); $tree->setNode("22","20","NIKE长袖"); $tree->setNode("23","20","361长袖"); $tree->setNode("24","22","NIKE长袖-均码"); $tree->setNode("25","22","NIKE长袖-短码"); $tree->setNode("26","14","惠普-N90-14寸"); $tree->setNode("27","14","惠普-N90-15寸"); $tree->setNode("28","14","惠普-N90-17寸"); $tree->setNode("29","28","惠普-N90-17寸-高性能企业版"); $tree->setNode("30","28","惠普-N90-17寸-普通家用版"); //获取一个节点的所有父节点 //print_r ($tree->getNodeLever(12)); //print_r ($tree->getParentsTree(12)); //$childs = $tree->getChildsTree(1); //print_r($childs); //echo "/r/n/r/n/r/n/r/n"; /* foreach($childs as $key=>$value){  echo $key."<br>";  //echo $tree->getLayer($key).$tree->getValue($key)."<br>"; } */ $tree->getAll(); foreach($tree->res as $val){  echo $val."<br>"; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>生成Tree</title> </head> <body> <h5>生成标签测试</5> <select> <?php  foreach($tree->res as $key=>$val){   echo "<option value='{$key}'>{$val}</option>";  } ?> </select> </body> </html>

查看更多关于PHP生成树状结构的方法的详细内容...

  阅读:45次