<?php
/*******************************************************************
 * 版权协议：2009-2019
 * 版权所有: PHP-北京金南曦网络技术有限公司旗下PHPWMS，PHP商城系统技术支持中心http://www.php188.net，并保留所有权利。 
* PHP商城系统网址: http://www.php188.com
 * PHPWMS系统网址：http://www.phpwms.com
 * 销售电话：010-87875088
 * 销售电话：010-87875188 
*------------------------------------------------------------------
 * 这不是一个完全免费软件！您只能在不用于商业目的的前提下对程序代码进
 * 行修改和使用；不允许对程序代码以任何形式任何目的的再发布。
 *------------------------------------------------------------------
 * 文件名称：phpwms.tree.class.php
 * 摘    要：树处理类 可以不用对象方式实现 采用引用
 * 适用范围：PHPWMS 1.0
 * 版    本：1.0
 *------------------------------------------------------------------
 * Script Written By phpwms项目组
 * 最后更新： 2009-09-24 phpwms 由PHP金南曦网络技术有限公司整理发布
 *******************************************************************/
class WMSTree{
	private $_result = array();
/**
 * <code>
 * $tree = new  WMSTree();
 * //从$array这个数组中找出分类ID为10的所有子分类
 *  $childern =  $tree->get_son($array,'id','parent_id',10,array('id','parent_id'),true);
 * <code>
 * 提取指定分类下的子 (递归)
 *
 * @param array $tree  需要出来的数据 二维数组 
 * @param string $son_item 分类ID字段
 * @param string $parent_item 分类父ID字段
 * @param int $parent_id 父分类ID号
 * @param array | string $showKey 需要显示数字组中的字段
 * @param boolean $showAll 是否全部显示 就是递进找出所有的子
 * @return array
 */
	function get_son($tree,$son_item,$parent_item,$parent_id=0,$showKey = '',$showAll = true){
		if(!is_array($tree)||empty($tree))return array();
		if (is_string($showKey) && !empty($showKey)) $showKey = array($showKey); 
		foreach ($tree as $t){
			if($t[$parent_item]==$parent_id){
				#处理自定义字段
             	 if(!empty($showKey)&&is_array($showKey)&&count($showKey)>1){
             	 	foreach ($showKey as $s)if(in_array($s,array_keys($t)))$r[$s] = $t[$s];
             	 	$this->_result[] = $r;
             	 }elseif(!empty($showKey)&&is_array($showKey)&&count($showKey)==1){
             	 		$this->_result[] = $t[$showKey[0]];
             	 }else{
             	 	$this->_result[] = $t;
             	 } #结束自定义字段处理
             	 if($showAll){
					array_filter($this->get_son($tree,$son_item,$parent_item,$t[$son_item],$showKey,$showAll));
             	 }
			}
		}
		return $this->_result;
	}
/**
 * 通过指定ID找出他的所有父分类 (参数和上相同)
 *
 * @param array $tree 
 * @param string $son_item 
 * @param string $parent_item
 * @param int $son_id
 * @param array $showKey
 * @param boolean $showall 
 * @return array
 */
	function get_parent($tree,$son_item,$parent_item,$son_id,$showKey = '',$showall = false){
		 if(!is_array($tree)||empty($tree))return array();
		 if (is_string($showKey) && !empty($showKey)) $showKey = array($showKey); 
		 foreach ($tree as $row){
		 	if($row[$son_item]==$son_id){
		 		if(!empty($showKey)&&is_array($showKey)&&count($showKey)>1){
             	 	foreach ($showKey as $s){
             	 		if(in_array($s,array_keys($row)))$r[$s] = $row[$s];
             	 	}
             	 	$this->_result[] = $r;
             	 }elseif(!empty($showKey)&&is_array($showKey)&&count($showKey)==1){
             	 	$this->_result[] = $row[$showKey[0]];
             	 }else{
             	 		$this->_result[] = $row;
             	 	} 
             	 if($showall){
		 			array_filter($this->get_parent($tree,$son_item,$parent_item,$row[$parent_item],$showKey,$showall));
             	 }
		 	}
		 }
		 return array_reverse($this->_result);
	}
/**
 * 构造分类树 返回array 
 *
 * @param array $trees 需要处理的array
 * @param int $parent_id
 * @param string $space 占位符
 * @param int $level 
 * @param string $son_item
 * @param string $parent_item
 * @return array
 */
function building_tree($trees,$parent_id = 0,$space = '|-',$level = 0,$son_item='category_id',$parent_item='parent_id'){
		foreach ($trees as $v){
			if($v[$parent_item] == $parent_id){
				$v['spacer'] = $space;
				$v['level'] = $level;
				//构造分类下的品牌数据
				$this->_tree[] = $v;
				$this->building_tree($trees,$v[$son_item],'　'.$space,($level+1),$son_item,$parent_item);
			}
		}
	return $this->_tree;
}
}
?>