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作的文本留言本的例子(三)
Oct 09 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
Nov 10 PHP
PHP设计模式之结构模式的深入解析
Jun 13 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
浅谈PHP中output_buffering
Jul 13 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
php单例模式的简单实现方法
Jun 10 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
PHP中的访问修饰符简单比较
Feb 02 PHP
thinkphp5实现无限级分类
Feb 18 PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 09 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缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
2013/03/19 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
微信小程序实现美团菜单
2018/06/06 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
[01:31]完美与DOTA2历程
2014/07/31 DOTA
Python实现list反转实例汇总
2014/11/11 Python
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
Python爬虫实现验证码登录代码实例
2019/05/10 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
这段代码难道不该打印出56吗
2013/02/27 面试题
求职简历自荐信范文
2013/10/21 职场文书
大学生个人简历中的自我评价
2013/12/27 职场文书
爸爸的花儿落了教学反思
2014/02/20 职场文书
2014年煤矿工人工作总结
2014/12/08 职场文书
泰山导游词
2015/02/02 职场文书
党员身份证明材料
2015/06/19 职场文书
Hive常用日期格式转换语法
2022/06/25 数据库