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;
}
|
Php code
* Convert array to tree
* Example: 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')
);convert to
* 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 The array to be converted
* @param string $key The key to confirm the parent and child in the array, in the example it is "id"
* @param string $parentKey The parent key in the array, in the example is "parentId"
* @param type $childrenKey The key to index the child node on the tree node, in the example "children"
* @return array Returns the generated tree
*/
代码如下 |
|
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);
}
}
|
Php code
/**Recursive method:**/
$rows = array(
0 => array('id' => 1, 'name' => 'Menu 1', 'parentId' => 0)
, 1 => array('id' => 2, 'name' => 'Menu 2', 'parentId' => 0)
, 2 => array('id' => 3, 'name' => 'Menu 3', 'parentId' => 0)
, 3 => array('id' => 4, 'name' => 'Menu 1_1', 'parentId' => 1)
, 4 => array('id' => 5, 'name' => 'Menu 1_2', 'parentId' => 1)
, 5 => array('id' => 6, 'name' => 'Menu 2_1', 'parentId' => 2)
);
print_r(getTree($rows, 0, 'id', 'parentId'));
The code is as follows
|
|
代码如下 |
|
/**
* 数组根据父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;
} |
/**
* The array generates a tree based on the parent id
* @staticvar int $depth recursion depth
* @param array $data array data
* @param integer $pid value of parent id
* @param string $key id The key value in the $data array
* @param string $chrildKey The key value of the child to be generated
* @param string $pKey The key value of the parent id in the $data array
* @param int $maxDepth Maximum recursion depth to prevent infinite recursion
* @return array The reorganized 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;
}
An example
代码如下 |
复制代码 |
TREE
// 树组的顺序即是分类的顺序,因此前当分类的下级子类一定要紧随其后
$tree= array(
1 => array('id'=>1, 'cname'=>'一级分类', 'pid'=>0),
100 => array('id'=>100, 'cname'=>'特意加进去的二级分类', 'pid'=>1),
101 => array('id'=>101, 'cname'=>'特意加进去的二级分类2222222222', 'pid'=>1),
2 => array('id'=>2, 'cname'=>'二级分类', 'pid'=>1),
3 => array('id'=>3, 'cname'=>'三级分类', 'pid'=>2),
4 => array('id'=>4, 'cname'=>'四级分类', 'pid'=>3),
5 => array('id'=>5, 'cname'=>'四级分类2', 'pid'=>3),
200 => array('id'=>200, 'cname'=>'55555', 'pid'=>5),
6 => array('id'=>6, 'cname'=>'另一级分类', 'pid'=>0),
7 => array('id'=>7, 'cname'=>'First First First', 'pid'=>0),
8 => array('id'=>8, 'cname'=>'First First First', 'pid'=>7),
);
// 指定分类ID,返回子类量(不进行深度递归)
function getChildTotal($id)
{
global $tree;
$total = 0;
foreach($tree as $value)
{
if ($id == $value['pid'])
{
$total++;
}
}
return $total;
}
// 指定分类ID,www.111cn.net并返回数组(不进行深度递归)
function getChildArray($id)
{
global $tree;
$array = array();
foreach($tree as $key=>$value)
{
if ($id == $value['pid'])
{
$array[$key] = $value;
}
}
return $array;
}
// 递归查询方式将树数组转换成HTML嵌套树
function getTreeHTML($tree,$level = 0)
{
if ($tree)
{
$level += 1;
foreach($tree as $id => $node)
{
$html .= " ";
$html .= '- '.$node['cname']."
";
if (getChildTotal($node['id']))
{
$tree_last = getChildArray($node['id']);
$html .= ' - ';
$html .= getTreeHTML($tree_last,$level);
$html .= ' ';
}
$html .= ' ';
}
}
return $html;
}
$html = getTreeHTML( getChildArray(0) );
echo ' ';
echo $html;
echo ' ';
?>
|
http://www.bkjia.com/PHPjc/730238.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/730238.htmlTechArticlePhp代码 代码如下 * $sourceArr 原来的数组 * $key 主键 * $parentKey 与主键关联的父主键 * $childrenKey 生成的孩子的键名 * */ function arrayToTree($source...
|