综合所有需求,不用递归,不用担心数据是否排序,速度惊人。不多说
不需要看懂为什么,用的爽就行,快速无限递归
不懂问我,万能无限分级。
/**
* @param $arr 数据库里获取的结果集,不论是健名,还是健名为id,自动转换
* @param string $id
* @param string $pid
* @param string $link 关联符
* @param string $p_c 为child时下级为子类,为parent下级为父类
* @return mixed 返回值,数组每个参数带有下级,不是下拉类型是类表
*/
function tree_list_universal($arr, $id='id', $pid='pid',$link='child',$p_c='child') {
$t=array();
if(array_keys($arr)[0]==0){
foreach($arr as $v){
is_object($v) && $v = $v->toArray();
$t[$v[$id]] = $v;
}
$arr=$t;
}
foreach ($arr as $k => $item){
is_object($item) && $item = $item->toArray();
if( $item[$pid] ){
if($p_c=='parent'){
if( ! isset($t[$item[$pid]][$link][$item[$pid]]) )
$t[$item[$id]][$link][$item[$pid]] =& $t[$item[$pid]];
}
else{
$t[$item[$pid]][$link][$item[$id]] =& $t[$k];
}
}
}
return $t;
}
怎么用看注释,重点解释,tree_list_universal是用来列表显示,需要每条数据带有上级或者下级使用
/**
* @param $items 数据库里获取的结果集,不论是健名,还是健名为id,自动转换
* @param string $id
* @param string $pid
* @param string $link 关联符
* @param null $parent 为选择想要的下级id,举个栗子:id=1 pid=0 那么$prent=0取得id=1的数据
* @return array 返回值,拉类型模式,下级被上级回收,下级就不会显示在列表上
*/
function tree_select_universal($arr,$id='id',$pid='pid',$link='child',$parent=null){
$tree = array();
if(array_keys($arr)[0]==0){
foreach($arr as $v){
is_object($v) && $v = $v->toArray();
$t[$v[$id]] = $v;
}
$arr=$t;
}
foreach($arr as $item){
is_object($item) && $item = $item->toArray();
if(isset($parent)){
$arr[$item[$pid]][$link][$item[$id]] = &$arr[$item[$id]];
}else{
if(isset($arr[$item[$pid]])){
$arr[$item[$pid]][$link][] = &$items[$item[$id]];
}else{
$tree[] = &$arr[$item[$id]];
}
}
}
return isset($parent) ? $arr[$parent][$link] : $tree;
}
tree_select_universal 是用来下拉显示,具体下拉需要什么样的数据结构不多说,是在想不出来,问我,$parent参数可以不带,那么显示当前所有数据分级了,这解决了一些数据结构不知道pid是多少问题,带参数时候就制定返回当前指定的子集。