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

本文介绍了一种在PHP中生成树形结构的方法,通过使用数组来构建和展示树形结构,包括递归方法和非递归方法。文章提供了具体的函数实现,并展示了如何通过不同的函数得到不同形式的树形数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 );
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值