PHP生成树的方法

5年以前  |  阅读数:867 次  |  编程语言: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程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例