首页 > php数组 > php数组转换成树的几个例子

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 & gt; = 0; $i--) {
        if (isset($tempSrcArr[$sourceArr[$i][$parentKey]])) {
            $tArr = array_pop($tempSrcArr);
            $tempSrcArr[$tArr[$parentKey]][$childrenKey] = (isset($tempSrcArr[$tArr[$parentKey]][$childrenKey]) & amp; & amp;
            is_array($tempSrcArr[$tArr[$parentKey]][$childrenKey])) ? $tempSrcArr[$tArr[$parentKey]][$childrenKey] : array();
            array_push($tempSrcArr[$tArr[$parentKey]][$childrenKey], $tArr);
        }
    }
    return $tempSrcArr;
}
?>

PHP代码如下:

<?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)  
)  
*/
?>
<?php
/*
 * @param array $sourceArr 要转换的数组
 * @param string $key 数组中确认父子的key,例子中为&ldquo;id&rdquo;
 * @param string $parentKey 数组中父key,例子中为&ldquo;parentId&rdquo;
 * @param type $childrenKey 要在树节点上索引子节点的key,例子中为&ldquo;children&rdquo;
 * @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'));
?>


代码如下:

<?php
/**  
 * 数组根据父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(http://pic1.phprm.com/2014/06/29/tree_top.jpg) no-repeat 0 -24px;  
    } 
    /*一级标题*/ 
    .kyp_tree dt{ 
    background:url(http://pic1.phprm.com/2014/06/29/tree_top.jpg) 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(http://pic1.phprm.com/2014/06/29/tree_arrow.jpg) no-repeat 2px 10px; 
    font-size:12px; 
    } 
    /*一级张开样式*/ 
    .kyp_tree dt.open{ 
    background:url(http://pic1.phprm.com/2014/06/29/tree_top.jpg) no-repeat 2px 12px;  
    } 
    /*张开样式*/ 
    .kyp_tree dd dt.open{ 
    background:url(http://pic1.phprm.com/2014/06/29/tree_arrow.jpg) 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,并返回数组(不进行深度递归)
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/shuzu/fs3587.html

转载随意,但请附上文章地址:-)

标签:php数组 转换成树

相关文章

发表留言