常用递归函数

未结帖
0 1527
ajian jack 2014-06-17
悬赏:5飞吻
public function index(){
	Load('extend');			//加载扩展方法
	$Category=D('Category');
	$list=$Category->order('sort desc')->select();//实现同级节点排序
	$list=list_to_tree($list,'id','fid'); //详细参数见手册
	$list=$this->findChild($list);	
	dump($list);
}
protected  function findChild($arr){
		static $tree=array();
		foreach ($arr as $key=>$val){
				$tree[]=$val;
				if (isset($val['_child'])){
					$this->findChild($val['_child']);
				}		
			}
	return $tree;
}
/**
 * 把返回的数据集转换成Tree
 * @access public
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 */
function list_to_tree($list, $pk='id',$pid = 'pid',$child = '_child',$root=0) {
	// 创建Tree
	$tree = array();
	if(is_array($list)) {
		// 创建基于主键的数组引用
		$refer = array();
		foreach ($list as $key => $data) {
			$refer[$data[$pk]] =& $list[$key];
		}
		foreach ($list as $key => $data) {
			// 判断是否存在parent
			$parentId = $data[$pid];
			if ($root == $parentId) {
				$tree[] =& $list[$key];
			}else{
				if (isset($refer[$parentId])) {
					$parent =& $refer[$parentId];
					$parent[$child][] =& $list[$key];
				}
			}
		}
	}
	return $tree;
}

/**
 * 对查询结果集进行排序
 * @access public
 * @param array $list 查询结果
 * @param string $field 排序的字段名
 * @param array $sortby 排序类型
 * asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
function list_sort_by($list,$field, $sortby='asc') {
   if(is_array($list)){
	   $refer = $resultSet = array();
	   foreach ($list as $i => $data)
		   $refer[$i] = &$data[$field];
	   switch ($sortby) {
		   case 'asc': // 正向排序
				asort($refer);
				break;
		   case 'desc':// 逆向排序
				arsort($refer);
				break;
		   case 'nat': // 自然排序
				natcasesort($refer);
				break;
	   }
	   foreach ( $refer as $key=> $val)
		   $resultSet[] = &$list[$key];
	   return $resultSet;
   }
   return false;
}

/**
 * 在数据列表中搜索
 * @access public
 * @param array $list 数据列表
 * @param mixed $condition 查询条件
 * 支持 array('name'=>$value) 或者 name=$value
 * @return array
 */
function list_search($list,$condition) {
	if(is_string($condition))
		parse_str($condition,$condition);
	// 返回的结果集合
	$resultSet = array();
	foreach ($list as $key=>$data){
		$find   =   false;
		foreach ($condition as $field=>$value){
			if(isset($data[$field])) {
				if(0 === strpos($value,'/')) {
					$find   =   preg_match($value,$data[$field]);
				}elseif($data[$field]==$value){
					$find = true;
				}
			}
		}
		if($find)
			$resultSet[]	 =   &$list[$key];
	}
	return $resultSet;
}


热忱回答0


最近热帖

近期热议

  1. javascript——prototype与__proto 9
  2. Mysql 中出现的Data truncated for column 3
  3. 在nginx中使用x-sendfile的解决方案 3
  4. 高版本jQuery面插件实现Ajax上传图片 1
  5. Thinkphp Socket.class.php 类的使用 1
  6. 使用ionic3创建第一个App 0
  7. ios-oc html5 0
  8. nginx.conf 0
  9. 基于ionic3.4.0的项目搭建 0
  10. php 缩略图 0