`
ling凌yue月
  • 浏览: 339310 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

数组转换为树

    博客分类:
  • php
阅读更多

 

 

/**
* $sourceArr 原来的数组
* $key 主键
* $parentKey 与主键关联的父主键
* $childrenKey 生成的孩子的键名
*
*/

function arrayToTree($sourceArr, $key, $parentKey, $childrenKey)
{
    $tempSrcArr = array();
    foreach ($sourceArr as  $v)
    {
        $tempSrcArr[$v[$key]] = $v;
    }
    $i = 0;
    $count = count($sourceArr);
    for($i = ($count - 1); $i >=0; $i--)
    {
        if (isset($tempSrcArr[$sourceArr[$i][$parentKey]]))
        {
           $tArr = array_pop($tempSrcArr);
           $tempSrcArr[$tArr[$parentKey]][$childrenKey] = (isset($tempSrcArr[$tArr[$parentKey]][$childrenKey]) && is_array($tempSrcArr[$tArr[$parentKey]][$childrenKey])) ? $tempSrcArr[$tArr[$parentKey]][$childrenKey] : array();
           array_push ($tempSrcArr[$tArr[$parentKey]][$childrenKey], $tArr);
        }
    }
    return $tempSrcArr;
}

 

 

/**
 * 将数组转换成树
 * 例子:将 array(
			array('id'=>1,'parentId' => 0,'name'=> 'name1')
			,array('id'=>2,'parentId' => 0,'name'=> 'name2')
			,array('id'=>4,'parentId' => 1,'name'=> 'name1_4')
			,array('id'=>15,'parentId' => 1,'name'=> 'name1_5')
	);转换成
 * Array(
    [1] => Array([id] => 1
            [parentId] => 0
            [name] => name1
            [children] => Array(
                    [0] => Array([id] => 15,[parentId] => 1,[name] => name1_5)
                    [1] => Array([id] => 4,[parentId] => 1,[name] => name1_4)
                )
        )
    [2] => Array([id] => 2,[parentId] => 0,[name] => name2)
)
 * @param array $sourceArr 要转换的数组
 * @param string $key 数组中确认父子的key,例子中为“id”
 * @param string $parentKey 数组中父key,例子中为“parentId”
 * @param type $childrenKey 要在树节点上索引子节点的key,例子中为“children”
 * @return array 返回生成的树
 */
function arrayToTree($sourceArr, $key, $parentKey, $childrenKey)
{
	$tempSrcArr = array();

	$allRoot = TRUE;
	foreach ($sourceArr as  $v)
	{
		$isLeaf = TRUE;
		foreach ($sourceArr as $cv )
		{
			if (($v[$key]) != $cv[$key])
			{
				if ($v[$key] == $cv[$parentKey])
				{
					$isLeaf = FALSE;
				}
				if ($v[$parentKey] == $cv[$key])
				{
					$allRoot = FALSE;
				}
			}
		}
		if ($isLeaf)
		{
			$leafArr[$v[$key]] = $v;
		}
		$tempSrcArr[$v[$key]] = $v;
	}
	if ($allRoot)
	{
		return $tempSrcArr;
	}
	else
	{
		unset($v, $cv, $sourceArr, $isLeaf);
		foreach ($leafArr as  $v)
		{
			if (isset($tempSrcArr[$v[$parentKey]]))
			{
				$tempSrcArr[$v[$parentKey]][$childrenKey] = (isset($tempSrcArr[$v[$parentKey]][$childrenKey]) && is_array($tempSrcArr[$v[$parentKey]][$childrenKey])) ? $tempSrcArr[$v[$parentKey]][$childrenKey] : array();
				array_push ($tempSrcArr[$v[$parentKey]][$childrenKey], $v);
				unset($tempSrcArr[$v[$key]]);
			}
		}
		unset($v);
		return arrayToTree($tempSrcArr, $key, $parentKey, $childrenKey);
	}
}

 

 

 

/**递归方法:**/

$rows = array(
    0 => array('id' => 1, 'name' => '菜单1', 'parentId' => 0)
    , 1 => array('id' => 2, 'name' => '菜单2', 'parentId' => 0)
    , 2 => array('id' => 3, 'name' => '菜单3', 'parentId' => 0)
    , 3 => array('id' => 4, 'name' => '菜单1_1', 'parentId' => 1)
    , 4 => array('id' => 5, 'name' => '菜单1_2', 'parentId' => 1)
    , 5 => array('id' => 6, 'name' => '菜单2_1', 'parentId' => 2)
);
print_r(getTree($rows, 0, 'id', 'parentId'));

/**
 * 数组根据父id生成树
 * @staticvar int $depth 递归深度
 * @param array $data 数组数据
 * @param integer $pid 父id的值
 * @param string $key id在$data数组中的键值
 * @param string $chrildKey 要生成的子的键值
 * @param string $pKey 父id在$data数组中的键值
 * @param int $maxDepth 最大递归深度,防止无限递归
 * @return array 重组后的数组
 */
function getTree($data, $pid = 0, $key = 'id', $pKey = 'parentId', $childKey = 'child', $maxDepth = 0){
	static $depth = 0;
	$depth++;
	if (intval($maxDepth) <= 0)
	{
		$maxDepth = count($data) * count($data);
	}
	if ($depth > $maxDepth)
	{
		exit("error recursion:max recursion depth {$maxDepth}");
	}
	$tree = array();
	foreach ($data as $rk => $rv)
	{
		if ($rv[$pKey] == $pid)
		{
			$rv[$childKey] = getTree($data, $rv[$key], $key, $pKey, $childKey, $maxDepth);
			$tree[] = $rv;
		}
	}
	return $tree;
}

 

 update 2014-04-17

 

/**
	 * 生成树列表
	 *
	 */
    static function createGroupSelect($haystack, $focusOpt = false){
		$result = '<select name="pid">';
		$groupTree = getTree($haystack, 0, 'ag_id', 'ag_pid');
		echo $result.createOption($groupTree, $focusOpt).'</select>';
	}

	/**
	 * 根据树生成option
	 *
	 */
	static function createOption($tree, $focusOpt = false, $deepth = 0){

		foreach($tree as $gtv){
			$nullStr = ($deepth == 0) ? '' : str_repeat('&nbsp;', $deepth * 4 - 1);
			$preStr = ($deepth == 0) ? '' : (isset($gtv['last']) ? '└' : '├');
			if ($focusOpt && ($gtv['ag_id'] == $focusOpt)){
				$result .= '<option value="'.$gtv['ag_id'].'" selected >'.$nullStr.$preStr.$gtv['ag_name'].'</option>';
			}else{
				$result .= '<option value="'.$gtv['ag_id'].'">'.$nullStr.$preStr.$gtv['ag_name'].'</option>';
			}
			if(!empty($gtv['child'])){
				$result .= createOption($gtv['child'], $focusOpt, $deepth+1);
			}
		}
		return $result;
	}

/**
	 * 数组根据父id生成树
	 * @staticvar int $depth 递归深度
	 * @param array $data 数组数据
	 * @param integer $pid 父id的值
	 * @param string $key id在$data数组中的键值
	 * @param string $chrildKey 要生成的子的键值
	 * @param string $pKey 父id在$data数组中的键值
	 * @param int $maxDepth 最大递归深度,防止无限递归
	 * @return array 重组后的数组
	 */
	static function getTree($data, $pid = 0, $key = 'id', $pKey = 'parentId', $childKey = 'child', $maxDepth = 0){
		static $depth = 0;
		$depth++;
		if (intval($maxDepth) <= 0)
		{
			$maxDepth = count($data) * count($data);
		}
		if ($depth > $maxDepth)
		{
			exit("error recursion:max recursion depth {$maxDepth}");
		}
		$tree = array();
		foreach ($data as $rk => $rv)
		{
			if ($rv[$pKey] == $pid)
			{
				$rv[$childKey] = getTree($data, $rv[$key], $key, $pKey, $childKey, $maxDepth);
				$tree[] = $rv;
			}
		}
		if(!empty($tree)){
			$tree[count($tree) - 1]['last'] = 1;
		}
		return $tree;
	}

 

 

 

分享到:
评论
2 楼 ling凌yue月 2014-10-31  
Errorize 写道
你是不是搞错了?Java代码是这样子的么?

是PHP,不是JAVA
1 楼 Errorize 2014-10-26  
你是不是搞错了?Java代码是这样子的么?

相关推荐

    js数组转换成tree结构数组

    js数组转换成tree结构数组算法

    php 数组转换成树形结构输出代码

    php 数组转换成树形结构输出代码php 数组转换成树形结构输出代码php 数组转换成树形结构输出代码

    LeetCode精选TOP面试题108.将有序数组转换为二叉搜索树

    题目描述 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的...将有序数组转换为二叉搜索树的结果肯定是不唯一的,因为存在多种建树方法。

    将有序数组转换为二叉搜索树.md

    将有序数组转换为二叉搜索树.md

    108将有序数组转换为二叉搜索树.zip

    108将有序数组转换为二叉搜索树.zip

    smart-array-to-tree:快速将大量数据数组转换为树

    English |智能阵列到树 快速将大量数据数组转换为嵌套数据结构! 使用阵列长度为46086的测试数据,只需花费约0.1秒。安装与使用在Node.js中: $ npm i smart-arraytotree --save var smartArrayToTree = require ( '...

    01-数组转树.md

    将数组转换为树形结构的基本思路是遍历数组,将每个节点组织到一个 map 中,然后基于父节点 id 将每个节点链接到其对应的父节点上。这种做法的关键点在于需要快速访问任意节点,因此使用 map 来实现 O(1) 的时间...

    算法笔记,将有序数组转为二叉搜索树

    将有序数组转换为二叉搜索树 本文将详细解释如何将有序数组转换为二叉搜索树,包括问题描述、解题思路、Java 和 Python 实现代码以及时间和空间复杂度分析。 问题描述 给定一个整数数组 nums,其中元素已经按升序...

    ArrayTree:仅从二维数组生成树结构数组的好工具

    ArrayTree 是一种将二维数组转换为树结构(也称为嵌套或分层)数组的工具。 下面是一个例子: $ dataList = array ( array ( 'id' =&gt; 1 , 'parent_id' =&gt; 0 , 'name' =&gt; 'games' ), array ( 'id' =&gt; 2 , ...

    c语言leetcode题解之第108题将有序数组转换为二叉搜索树.zip

    c c语言leetcode题解之第108题将有序数组转换为二叉搜索树

    python-leetcode面试题解之第108题将有序数组转换为二叉搜索树-题解.zip

    本题目的核心是第108题,即“将有序数组转换为二叉搜索树”,这是一个常见的数据结构与算法问题,对于理解和掌握二叉搜索树以及其构建方法至关重要。 二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树,它...

    php数组生成树

    通过将扁平化的一维数组转换为多维树结构,我们可以更好地管理和操作具有层级关系的数据。这个无限递归子类的源代码示例展示了如何在实际项目中实现这一功能,适用于处理各种场景,如构建多级菜单、组织结构等。

    java-leetcode题解之第108题将有序数组转换为二叉搜索树.zip

    在本压缩包中,我们关注的是Java编程领域的一个经典问题,即LeetCode第108题:“将有序数组转换为二叉搜索树”。这是一道关于数据结构与算法的题目,主要涉及到二叉搜索树(Binary Search Tree, BST)的概念以及如何...

    分别对无序数组和有序数组建立二叉树,实现遍历和查找

    对于有序数组,可以采用分治策略来构建一棵平衡二叉搜索树,这样可以确保树的高度尽可能小,从而提高查找效率。具体步骤如下: 1. **选择中间节点作为根节点**:首先找到数组的中间元素作为根节点。 2. **递归构建...

    js代码-数组转化树形结构

    总结起来,JavaScript中将数组转换为树形结构的关键在于理解数据的层级关系,并通过构建节点映射和递归处理子节点来实现。`main.js`中的函数`arrayToTree`就是这样一个实现,适用于具有"id"和"parentId"键的数组数据...

    将有序数组转换为二叉搜索树(递归中序遍历+中间数作为根节点)1

    有序数组转换为高度平衡二叉搜索树(BST)是一个常见的数据结构问题,它结合了数组的线性特性与二叉搜索树的搜索效率。在给定的标题和描述中,我们面临的问题是将一个升序排列的整数数组转换成一棵高度平衡的二叉...

    把实体类数组转换为DataTable

    在C#编程中,将实体类数组转换为`DataTable`对象是一个常见的需求,尤其是在处理数据库操作、数据绑定或数据交换时。`DataTable`是.NET框架中的一个类,它提供了存储和操作表格数据的能力,而实体类则常用于表示业务...

    js 实现 list转换成tree的方法示例(数组到树)

    为了将这个数组转换为树形结构,我们可以采用双重遍历的策略。第一遍遍历是为了找到每个节点的父节点,第二遍遍历是为了构建子节点数组。 下面是实现这个转换的函数`listToTree`: ```javascript function ...

    js代码-数组根据pid转为树形结构的数组

    本案例中的"js代码-数组根据pid转为树形结构的数组"涉及到的就是将一个基于父级ID(PID)的扁平化数组转换为树形结构的数组。这种转换在构建组织结构、文件系统或者菜单导航等场景中非常常见。 首先,我们来理解...

    把扁平化的数据转换成树形结构的JSON

    在许多应用场景中,我们可能需要将扁平化的数据结构转换为树形结构,以便更好地理解和操作数据。扁平化数据通常是线性的,而树形结构则能反映数据之间的层级关系,这对于表示目录、菜单、组织结构等非常有用。本话题...

Global site tag (gtag.js) - Google Analytics