复杂成树(不是递归方式)

复杂递归成树

欢迎使用Markdown编辑器

<?php
namespace micro\components;

class Tree{
	protected static $config = array(
		/* 主键 */
		'primary_key' 	=> 'id',
		/* 父键 */
		'parent_key'  	=> 'parent_id',
		/* 展开属性 */
		'expanded_key'  => 'expanded',
		/* 叶子节点属性 */
		'leaf_key'      => 'leaf',
		/* 孩子节点属性 */
		'children_key'  => 'children',
		/* 是否展开子节点 */
		'expanded'    	=> false
	);

    /**
     * 数组
     *
     * @var array
     */
	protected static $result = array();

    /**
     * 暂存
     *
     * @var array
     */
	protected static $level = array();

    /**
     * :
     *
     * @param array $data
     * @param array $options
     *
     * @return array
     */
	public static function makeTree($data,$options=array() ){
		$dataset = self::buildData($data,$options);
		$r = self::makeTreeCore(0,$dataset,'normal');
		return $r;
	}
	
	/* 生成线性结构, 便于HTML输出, 参数同上 */
	public static function makeTreeForHtml($data,$options=array()){
	
		$dataset = self::buildData($data,$options);
		$r = self::makeTreeCore(0,$dataset,'linear');
		return $r;	
	}
	
	/* 格式化数据, 私有方法 */
	private static function buildData($data,$options){
		$config = array_merge(self::$config,$options);
		self::$config = $config;
		extract($config);

		$r = array();
		foreach($data as $item){
			$id = $item[$primary_key];
			$parent_id = $item[$parent_key];
			$r[$parent_id][$id] = $item;
		}
		
		return $r;
	}
	
	/* 生成树核心, 私有方法  */
	private static function makeTreeCore($index,$data,$type='linear')
	{
		extract(self::$config);
		foreach($data[$index] as $id=>$item)
		{
			if($type=='normal'){
				if(isset($data[$id]))
				{
					$item[$expanded_key]= self::$config['expanded'];
					$item[$children_key]= self::makeTreeCore($id,$data,$type);
				}
				else
				{
					$item[$leaf_key]= true;  
				}
				$r[] = $item;
			}else if($type=='linear'){
				$parent_id = $item[$parent_key];
				self::$level[$id] = $index==0?0:self::$level[$parent_id]+1;
				$item['level'] = self::$level[$id];
				self::$result[] = $item;
				if(isset($data[$id])){
					self::makeTreeCore($id,$data,$type);
				}
				
				$r = self::$result;
			}
		}
		return $r;
	}
}


?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值