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 相关文章推荐
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
May 06 PHP
提高PHP编程效率的53个要点(经验小结)
Sep 04 PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 PHP
php重定向的三种方法分享
Feb 22 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
Sep 23 PHP
C#使用PHP服务端的Web Service通信实例
Apr 08 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 PHP
PHP缓存机制Output Control详解
Jul 14 PHP
PHP使用imagick扩展实现合并图像的方法
Apr 25 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
2016/11/10 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
JQuery实现table中tr上移下移的示例(超简单)
2018/01/08 jQuery
关于vue中 $emit的用法详解
2018/04/12 Javascript
vue实现简单loading进度条
2018/06/06 Javascript
Javascript如何实现扩充基本类型
2020/08/26 Javascript
如何在python中使用selenium的示例
2017/12/26 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
python程序快速缩进多行代码方法总结
2019/06/23 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
python新手学习可变和不可变对象
2020/06/11 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
2020/12/29 Python
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
2019/04/26 HTML / CSS
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
护士上岗前培训自我鉴定
2014/04/20 职场文书
网络技术专业求职信
2014/05/02 职场文书
学生自我评语
2015/01/04 职场文书
2016年“抗战胜利纪念日”71周年校园广播稿
2015/12/18 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
总结几个非常实用的Python库
2021/06/26 Python
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python