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 相关文章推荐
PHP4与PHP5的时间格式问题
Feb 17 PHP
php实现的简单压缩英文字符串的代码
Apr 24 PHP
PHP 日,周,月点击排行统计
Jan 11 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
Feb 14 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
Mar 18 PHP
php上传文件并显示上传进度的方法
Mar 24 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
Oct 08 PHP
使用php实现从身份证中提取生日
May 09 PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 PHP
PHP常用文件操作函数和简单实例分析
Jun 03 PHP
通过PHP实现获取访问用户IP
May 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
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
JavaScript实现256色转灰度图
2017/02/22 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
封装微信小程序http拦截器过程解析
2019/08/13 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
在Python的Flask框架中构建Web表单的教程
2016/06/04 Python
python简单验证码识别的实现方法
2019/05/10 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
彪马英国官网:PUMA英国
2019/02/11 全球购物
VC++笔试题
2014/10/13 面试题
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
python基于tkinter实现gif录屏功能
2021/05/19 Python