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 );
}
}
}
各种无限分类树结构方法收集
最新推荐文章于 2022-09-05 22:03:43 发布