PHP生成树的方法


Posted in PHP onJuly 28, 2015

本文实例讲述了PHP生成树的方法。分享给大家供大家参考。具体如下:

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

运行效果如下图所示:

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 相关文章推荐
php 更新数据库中断的解决方法
Jun 05 PHP
php 数学运算验证码实现代码
Oct 11 PHP
php实现的Captcha验证码类实例
Sep 22 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
Jul 28 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
php查询操作实现投票功能
May 09 PHP
php版微信返回用户text输入的方法
Nov 14 PHP
php二维码生成以及下载实现
Sep 28 PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 PHP
PHP实现的文件浏览器功能简单示例
Sep 12 PHP
laravel框架 api自定义全局异常处理方法
Oct 11 PHP
php计算税后工资的方法
Jul 28 #PHP
怎样搭建PHP开发环境
Jul 28 #PHP
php递归实现无限分类的方法
Jul 28 #PHP
php类自动加载器实现方法
Jul 28 #PHP
PHP实现的json类实例
Jul 28 #PHP
php无序树实现方法
Jul 28 #PHP
分享PHP函数实现数字与文字分页代码
Jul 28 #PHP
You might like
php下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
PHP 读取大文件的X行到Y行内容的实现代码
2013/06/24 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
2016/11/01 PHP
php支付宝APP支付功能
2020/07/29 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
Javascript的闭包
2009/12/31 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
分享有关jQuery中animate、slide、fade等动画的连续触发、滞后反复执行的bug
2016/01/10 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
Vue实现根据hash高亮选项卡
2019/05/27 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
基于javascript实现贪吃蛇小游戏
2019/11/25 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
[33:39]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第二局
2016/02/27 DOTA
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
最新pycharm安装教程
2020/11/18 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
商务英语求职自荐信范文
2013/12/24 职场文书
同学会主持词
2014/03/18 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
2014年个人委托书范本
2014/10/13 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
企业投资意向书
2015/05/09 职场文书
小学英语课教学反思
2016/02/15 职场文书
导游词之江南周庄
2019/12/06 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
浅谈Web Storage API的使用
2021/06/23 Javascript