PHP无限分类代码,支持数组格式化、直接输出菜单两种方式


Posted in PHP onMay 18, 2011
<?php 
/** 
+------------------------------------------------ 
* 通用的树型类 
+------------------------------------------------ 
* @author yangyunzhou@foxmail.com 
+------------------------------------------------ 
* @date 2010年11月23日10:09:31 
+------------------------------------------------ 
*/ 
class Tree 
{ /** 
+------------------------------------------------ 
* 生成树型结构所需要的2维数组 
+------------------------------------------------ 
* @author yangyunzhou@foxmail.com 
+------------------------------------------------ 
* @var Array 
*/ 
var $arr = array(); 
/** 
+------------------------------------------------ 
* 生成树型结构所需修饰符号,可以换成图片 
+------------------------------------------------ 
* @author yangyunzhou@foxmail.com 
+------------------------------------------------ 
* @var Array 
*/ 
var $icon = array('│','├',' └'); 
/** 
* @access private 
*/ 
var $ret = ''; 
/** 
* 构造函数,初始化类 
* @param array 2维数组,例如: 
* array( 
* 1 => array('id'=>'1','parentid'=>0,'name'=>'一级栏目一'), 
* 2 => array('id'=>'2','parentid'=>0,'name'=>'一级栏目二'), 
* 3 => array('id'=>'3','parentid'=>1,'name'=>'二级栏目一'), 
* 4 => array('id'=>'4','parentid'=>1,'name'=>'二级栏目二'), 
* 5 => array('id'=>'5','parentid'=>2,'name'=>'二级栏目三'), 
* 6 => array('id'=>'6','parentid'=>3,'name'=>'三级栏目一'), 
* 7 => array('id'=>'7','parentid'=>3,'name'=>'三级栏目二') 
* ) 
*/ 
function tree($arr=array()) 
{ 
$this->arr = $arr; 
$this->ret = ''; 
return is_array($arr); 
} 
/** 
* 得到父级数组 
* @param int 
* @return array 
*/ 
function get_parent($myid) 
{ 
$newarr = array(); 
if(!isset($this->arr[$myid])) return false; 
$pid = $this->arr[$myid]['pid']; 
$pid = $this->arr[$pid]['pid']; 
if(is_array($this->arr)) 
{ 
foreach($this->arr as $id => $a) 
{ 
if($a['pid'] == $pid) $newarr[$id] = $a; 
} 
} 
return $newarr; 
} 
/** 
* 得到子级数组 
* @param int 
* @return array 
*/ 
function get_child($myid) 
{ 
$a = $newarr = array(); 
if(is_array($this->arr)) 
{ 
foreach($this->arr as $id => $a) 
{ 
if($a['pid'] == $myid) $newarr[$id] = $a; 
} 
} 
return $newarr ? $newarr : false; 
} 
/** 
* 得到当前位置数组 
* @param int 
* @return array 
*/ 
function get_pos($myid,&$newarr) 
{ 
$a = array(); 
if(!isset($this->arr[$myid])) return false; 
$newarr[] = $this->arr[$myid]; 
$pid = $this->arr[$myid]['pid']; 
if(isset($this->arr[$pid])) 
{ 
$this->get_pos($pid,$newarr); 
} 
if(is_array($newarr)) 
{ 
krsort($newarr); 
foreach($newarr as $v) 
{ 
$a[$v['id']] = $v; 
} 
} 
return $a; 
} 
/** 
* ------------------------------------- 
* 得到树型结构 
* ------------------------------------- 
* @author yangyunzhou@foxmail.com 
* @param $myid 表示获得这个ID下的所有子级 
* @param $str 生成树形结构基本代码, 例如: "<option value=\$id \$select>\$spacer\$name</option>" 
* @param $sid 被选中的ID, 比如在做树形下拉框的时候需要用到 
* @param $adds 
* @param $str_group 
*/ 
function get_tree($myid, $str, $sid = 0, $adds = '', $str_group = '') 
{ 
$number=1; 
$child = $this->get_child($myid); 
if(is_array($child)) { 
$total = count($child); 
foreach($child as $id=>$a) { 
$j=$k=''; 
if($number==$total) { 
$j .= $this->icon[2]; 
} else { 
$j .= $this->icon[1]; 
$k = $adds ? $this->icon[0] : ''; 
} 
$spacer = $adds ? $adds.$j : ''; 
$selected = $id==$sid ? 'selected' : ''; 
@extract($a); 
$parentid == 0 && $str_group ? eval("\$nstr = \"$str_group\";") : eval("\$nstr = \"$str\";"); 
$this->ret .= $nstr; 
$this->get_tree($id, $str, $sid, $adds.$k.' ',$str_group); 
$number++; 
} 
} 
return $this->ret; 
} 
/** 
* 同上一方法类似,但允许多选 
*/ 
function get_tree_multi($myid, $str, $sid = 0, $adds = '') 
{ 
$number=1; 
$child = $this->get_child($myid); 
if(is_array($child)) 
{ 
$total = count($child); 
foreach($child as $id=>$a) 
{ 
$j=$k=''; 
if($number==$total) 
{ 
$j .= $this->icon[2]; 
} 
else 
{ 
$j .= $this->icon[1]; 
$k = $adds ? $this->icon[0] : ''; 
} 
$spacer = $adds ? $adds.$j : ''; 
$selected = $this->have($sid,$id) ? 'selected' : ''; 
@extract($a); 
eval("\$nstr = \"$str\";"); 
$this->ret .= $nstr; 
$this->get_tree_multi($id, $str, $sid, $adds.$k.' '); 
$number++; 
} 
} 
return $this->ret; 
} 
function have($list,$item){ 
return(strpos(',,'.$list.',',','.$item.',')); 
} 
/** 
+------------------------------------------------ 
* 格式化数组 
+------------------------------------------------ 
* @author yangyunzhou@foxmail.com 
+------------------------------------------------ 
*/ 
function getArray($myid=0, $sid=0, $adds='') 
{ 
$number=1; 
$child = $this->get_child($myid); 
if(is_array($child)) { 
$total = count($child); 
foreach($child as $id=>$a) { 
$j=$k=''; 
if($number==$total) { 
$j .= $this->icon[2]; 
} else { 
$j .= $this->icon[1]; 
$k = $adds ? $this->icon[0] : ''; 
} 
$spacer = $adds ? $adds.$j : ''; 
@extract($a); 
$a['title'] = $spacer.' '.$a['title']; 
$this->ret[$a['id']] = $a; 
$fd = $adds.$k.' '; 
$this->getArray($id, $sid, $fd); 
$number++; 
} 
} 
return $this->ret; 
} 
} 
?>
PHP 相关文章推荐
Zend引擎的发展 [15]
Oct 09 PHP
深入PHP操作MongoDB的技术总结
Jun 02 PHP
2014过年倒计时示例
Jan 31 PHP
PHP5.3与5.5废弃与过期函数整理汇总
Jul 10 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
Sep 04 PHP
ThinkPHP整合百度Ueditor图文教程
Oct 21 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
Jun 06 PHP
PHP常见加密函数用法示例【crypt与md5】
Jan 27 PHP
PHP实时统计中文字数和区别
Feb 28 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
Apr 13 PHP
PHP7 foreach() 函数修改
Mar 09 PHP
JS与PHP向函数传递可变参数的区别实例代码
May 18 #PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 #PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
May 18 #PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
May 17 #PHP
php小型企业库存管理系统的设计与实现代码
May 16 #PHP
Views rows style模板重写代码
May 16 #PHP
rrmdir php中递归删除目录及目录下的文件
May 15 #PHP
You might like
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
Parse正式发布开源PHP SDK
2014/08/11 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
2016/08/19 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
vue实例的选项总结
2020/06/09 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
python创建线程示例
2014/05/06 Python
Python的函数的一些高阶特性
2015/04/27 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
python 字符串只保留汉字的方法
2018/11/16 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
wxPython实现文本框基础组件
2019/11/18 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
详解Python中的Lock和Rlock
2021/01/26 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
社团活动策划书范文
2014/01/09 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android