各种无限分类树结构方法收集

来源:互联网 发布:apache shirt session 编辑:程序博客网 时间:2024/04/30 15:12
header('Content-Type:text/html;charset=utf-8');set_time_limit(0);$rows = array(array('id' => 1,'pid' => 0,'name' => '1',),array('id' => 2,'pid' => 1,'name' => '1-2',),// array('id' => 3,'pid' => 0,'name' => '3',),array('id' => 4,'pid' => 0,'name' => '4',),array('id' => 5,'pid' => 1,'name' => '1-5',),array('id' => 6,'pid' => 0,'name' => '6',),array('id' => 7,'pid' => 3,'name' => '3-7',),array('id' => 8,'pid' => 2,'name' => '1-2-8',),array('id' => 9,'pid' => 8,'name' => '1-2-8-9',),array('id' => 10,'pid' => 9,'name' => '1-2-8-10',),array('id' => 11,'pid' => 7,'name' => '3-7-11',),array('id' => 12,'pid' => 3,'name' => '3-12',),);$rows_map = array();foreach ($rows as $val) {// $rows_map[$val['id']] = array_merge($val,array('id'=>$val['id'],'pid'=>$val['pid']));//构建指定键名的关联数组$rows_map[$val['id']] = $val;}// var_dump(genTree5($rows_map));// var_dump(genTree9($rows_map));// var_dump(treeUseRecursive($rows));// output_level($tree);$tree = getDataTree($rows);var_dump($tree);showCategory($rows);die;/** 参数为关联数组,利用引用变量实现数组树,结果为索引数组,找不到父类直接忽略*/function getDataTree($rows, $id = 'id', $pid = 'pid', $child = 'son', $root = 0) {$tree = array();if (is_array($rows)) {$array = array ();foreach($rows as $key => $item) {$array[$item[$id]] = &$rows[$key];}foreach($rows as $key => $item) {$pid_val = $item[$pid];if($root == $pid_val) {$tree [] = &$rows [$key];} else {if (isset($array[$pid_val])) {$parent = &$array[$pid_val];$parent[$child][] = &$rows[$key];}}}}return $tree;}/** * 参数为关联数组 结果数组键名为id,构建pid为键的树,取顶层(0)下面的数据 * 此方法由@Tonton 提供  * @form http://levi.cg.am * @date 2012-12-12 */function genTree5(array $items) {foreach ($items as $item)$items[$item['pid']]['son'][$item['id']] = &$items[$item['id']];//父类id为键,当前分类引用为值return isset($items[0]['son']) ? $items[0]['son'] : array();//仅取顶层}/** * 参数为关联数组  结果为索引数组,找不到父类会放至顶层 * @author Xuefen.Tong * @form http://levi.cg.am * @param array $items * @return array */function genTree9(Array $items) {$tree = array();    //格式化好的树foreach ($items as $item)if (isset($items[$item['pid']]))$items[$item['pid']]['son'][] = &$items[$item['id']];else$tree[] = &$items[$item['id']];return $tree;}/** 递归树 参数为关联数组, 索引数组即可  找不到父类直接忽略*/function treeUseRecursive($list,$pid=0) {$tree = array();foreach ($list as $key => $val) {if($val['pid']==$pid) {unset($list[$key]);$son = treeUseRecursive($list,$val['id']);if($son) $val['son'] = $son;$tree[] = $val;}}return $tree;}/** 递归设置层级、输出 */function output_level($rows,$level=0,$level_str=' ',$child='child') {foreach ($rows as $val) {echo str_repeat($level_str, $level), $val['id'], '.', $val['name'],"({$level})<br/>\n";if(isset($val[$child])) output_level($val[$child], $level+1);}}/** 先构建父类id做索引,子项为值的数组,再利用递归输出层级结构树 */function showCategory($array) {$tree = array ();if ($array) {foreach ( $array as $v ) {$pid = $v ['pid'];$list = @$tree [$pid] ? $tree [$pid] : array ();array_push ( $list, $v );$tree [$pid] = $list;}}// 遍历输出根分类foreach ( $tree [0] as $k => $v ) {echo "$v[name]<br />";// 遍历输出根分类相应的子分类if (@$tree [$v ['id']]) {drawTree ( $tree [$v ['id']], $tree, 0 );}echo "<div style='height:10px;'></div>";}}function drawTree($arr, $tree, $level) {$level ++;$prefix = str_pad ( "|", $level + 1, '-', STR_PAD_RIGHT );foreach ( $arr as $k2 => $v2 ) {echo "$prefix$v2[name]<br />";if (isset ( $tree [$v2 ['id']] )) {drawTree ( $tree [$v2 ['id']], $tree, $level );}}}

0 0
原创粉丝点击