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 相关文章推荐
php入门小知识
Mar 24 PHP
php 应用程序安全防范技术研究
Sep 25 PHP
php无限遍历目录示例
Feb 21 PHP
php防止伪造的数据从URL提交方法
Jun 27 PHP
php截取指定2个字符之间字符串的方法
Apr 15 PHP
解读PHP中的垃圾回收机制
Aug 10 PHP
Laravel日志用法详解
Oct 09 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 PHP
Laravel中的chunk组块结果集处理与注意问题
Aug 15 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 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
3.从实例开始
2006/10/09 PHP
php实现的仿阿里巴巴实现同类产品翻页
2009/12/11 PHP
PHP循环结构实例讲解
2014/02/10 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
Bootstrap源码解读导航条(7)
2016/12/23 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
python中cPickle用法例子分享
2014/01/03 Python
详细介绍Ruby中的正则表达式
2015/04/10 Python
python如何重载模块实例解析
2018/01/25 Python
python3.x上post发送json数据
2018/03/04 Python
python 实现二维列表转置
2019/12/02 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
HTML5 语义化结构化规范化
2008/10/17 HTML / CSS
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
JNI的定义
2012/11/25 面试题
程序员跳槽必看面试题总结
2013/06/28 面试题
澳大利亚商务邀请函
2014/01/17 职场文书
2014年政协工作总结
2014/12/09 职场文书
个人汇报材料范文
2014/12/30 职场文书
学术会议通知
2015/04/15 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript