php数组转换成树的几个例子
下面我整理了一些常用的数组转换成树的实例与大家一起学习,我想大家都会很喜欢这篇文章的哦。
Php代码
<?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代码
* 将数组转换成树
* 例子:将 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);
}
}
?>
Php代码
<?php
/**递归方法:**/
$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;
}
?>
一个实例
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<title>TREE</title>
<style type="text/css">
/*树的全局CSS*/
.kyp_tree{
font: 12px/2.5 verdana;
float:left;display:inline;
}
.kyp_tree dd{
margin:0;padding:0;
margin-left:20px;
}
/*链接*/
.kyp_tree dl a{
font-size:12px;
color:#333;
text-decoration:none;
}
.kyp_tree dl a:hover, .kyp_tree dd dt.red_sub a{
font-size:12px;
color:#AE0002;
}
/*一级dl*/
.kyp_tree dl{
border-bottom:1px dashed #ccc;
margin:0;padding:0;
}
/*次级dl*/
.kyp_tree dl dl, .kyp_tree dl.last{
border:none;
}
.kyp_tree dd dt.currentClass{
background:url(tree_top.gif) no-repeat 0 -24px;
}
/*一级标题*/
.kyp_tree dt{
background:url(tree_top.gif) no-repeat 2px -57px;
padding-left:15px;
cursor:pointer;
font-size:13px;
height:30px;
line-height :27px;
line-height :32px9;
}
/*子标题*/
.kyp_tree dd dt{
background:url(tree_arrow.gif) no-repeat 2px 10px;
font-size:12px;
}
/*一级张开样式*/
.kyp_tree dt.open{
background:url(tree_top.gif) no-repeat 2px 12px;
}
/*张开样式*/
.kyp_tree dd dt.open{
background:url(tree_arrow.gif) no-repeat 0 -25px;
}
/*没有子节点的样式*/
.kyp_tree dt.nosub{
background:none;
}
</style>
<script type="text/javascript">
//<![CDATA[
jQuery.fn.createTree = function (fn, ini) {
var $ = jQuery,
ini = Object(ini);
this.find('dd').hide();
this.children('dl:last').addClass('last');
this.find('dt', this).each(function () {
var nosub = $(this).next('dd').size() == 0;
if (nosub) {
$(this).addClass('nosub');
}
if (ini.id && ini.id == $(this).attr('classify')) {
$(this).parents('dd').show().prev('dt').addClass('open');
$(this).addClass('red_sub');
if (nosub) {
$(this).addClass('currentClass')
} else {
$(this).next('dd').show();
$(this).addClass('open')
}
}
}).click(function (e) {
var dd = $(this).next('dd'),
isClose = dd.css('display') == 'none';
if (dd.size()) {
if (isClose) {
dd.show();
$(this).addClass('open')
} else {
dd.hide();
$(this).removeClass('open')
}
}
return fn && fn.call(this, e, dd)
});
if (ini.mx) {
this.find('dt').click(function (e) {
var J = $(this);
if (J.next('dd').size()) {
if (J.hasClass('open')) {
J.parent().siblings('dl').children('dd').hide();
J.parent().siblings('dl').children('dt').removeClass('open');
J.next('dd').show();
J.addClass('open')
}
}
})
}
};
(function ($) {
$(function () {
$('#tree_wrap').createTree(function (e, dd) { //回调(事件, 下一个dd)
$('#show').html(this.innerHTML + dd.size())
}, {
mx : 1,
id : 200
}) // mx是否互斥, id 当前类别
});
})(jQuery)
//]]>
</script>
</head>
<body>
<?php
// 树组的顺序即是分类的顺序,因此前当分类的下级子类一定要紧随其后
$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,http://www.phprm.com并返回数组(不进行深度递归)
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.= "<dl>";
$html.= '<dt classify="' . $node['id'] . '"><a href="http://www.baidu.com/">' . $node['cname'] . "</a></dt>";
if (getChildTotal($node['id'])) {
$tree_last = getChildArray($node['id']);
$html.= '<dd>';
$html.= getTreeHTML($tree_last, $level);
$html.= '</dd>';
}
$html.= '</dl>';
}
}
return $html;
}
$html = getTreeHTML(getChildArray(0));
echo '<div id="tree_wrap" class="kyp_tree">';
echo $html;
echo '</div><div id="show" style="clear:both;border-top:1px solid red"></div>';
?>
</body>
</html>永久地址:http://www.phprm.com/code/57549.html
转载随意~请带上教程地址吧^^