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面向对象全攻略 (五) 封装性
Sep 30 PHP
为PHP初学者的8点有效建议
Nov 20 PHP
php开发文档 会员收费1期
Aug 14 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
ThinkPHP之getField详解
Jun 20 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 PHP
PHP中phar包的使用教程
Jun 14 PHP
PHP递归统计系统中代码行数
Sep 19 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
Oct 09 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 PHP
Yii中特殊行为ActionFilter的使用方法示例
Oct 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
谏山创故乡大分县日田市水坝将设立《进击的巨人》立艾伦、三笠以及阿尔敏的铜像!
2020/03/06 日漫
色色整理的PHP面试题集锦
2012/03/08 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
php pdo操作数据库示例
2017/03/10 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
PHP Include文件实例讲解
2019/02/15 PHP
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
js图片实时加载提供网页打开速度
2014/09/11 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
Vue.js 中 axios 跨域访问错误问题及解决方法
2018/11/21 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
JavaScript 作用域实例分析
2019/10/02 Javascript
vue实现五子棋游戏
2020/05/28 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
[53:49]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
党员群众路线自我剖析材料
2014/10/06 职场文书
荆州古城导游词
2015/02/06 职场文书
信仰纪录片观后感
2015/06/08 职场文书
Python基础 括号()[]{}的详解
2021/11/07 Python
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis