您的位置:澳门402永利com > 计算机 网络 > php数组转换成树的几个例子,php生成无限栏目树

php数组转换成树的几个例子,php生成无限栏目树

发布时间:2019-09-25 07:36编辑:计算机 网络浏览(161)

     

    Php代码 

     代码如下

     代码如下

    $arr=Array(

     
    * $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('cid'=> 2,'cname'=>'新闻','pid'=> 0),

     
    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 再次来到生成的树
     */ 

      Array('cid'=> 4,'cname'=>'体育','pid'=> 0),

     代码如下

      Array('cid'=> 5,'cname'=>'娱乐','pid'=> 0),

    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); 
        } 
    }   

      Array('cid'=> 7,'cname'=>'热门消息','pid'=>2),

     
     
    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')); 

      Array('cid'=> 8,'cname'=>'小众音信','pid'=> 2),

     代码如下

      Array('cid'=> 9,'cname'=>'爵士乐新闻','pid'=> 8),

     
    /**
     * 数组依靠父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 最大递归深度,幸免Infiniti递归
     * @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 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ";
    <html xmlns=";
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src=";
    <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

    <?php

    // 树组的逐个便是分类的依次,由从前当分类的下级子类必需求紧随其后
    $tree= array(
    1 => array('id'=>1, 'cname'=>'超级分类', 'pid'=>0),

    $arr=Array(

    100 => array('id'=>100, 'cname'=>'刻意加进去的二级分类', 'pid'=>1),
    101 => array('id'=>101, 'cname'=>'特意加进去的二级分类2222222222', 'pid'=>1),

      Array('cid'=> 2,'cname'=>'新闻','pid'=> 0),

    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),
    );

      Array('cid'=> 4,'cname'=>'体育','pid'=> 0),

    // 钦命分类ID,再次回到子类量(不进行深度递归)
    function getChildTotal($id)
    {
    global $tree;
    $total = 0;
    foreach($tree as $value)
    {
    if ($id == $value['pid'])
    {
    $total++;
    }
    }
    return $total;
    }

      Array('cid'=> 5,'cname'=>'娱乐','pid'=> 0),

     

      Array('cid'=> 7,'cname'=>'热门消息','pid'=>2),

    // 钦定分类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;
    }

      Array('cid'=> 8,'cname'=>'小众音信','pid'=> 2),

    // 递归查询艺术将树数组调换来HTML嵌套树

      Array('cid'=> 9,'cname'=>'流行乐音讯','pid'=> 8),

    function getTreeHTML($tree,$level = 0)
    {
    if ($tree)
    {
    $level += 1;
    foreach($tree as $id => $node)
    {
    $html .= "<dl>";
    $html .= '<dt classify="'.$node['id'].'"><a href=";";
    if (getChildTotal($node['id']))
    {
    $tree_last = getChildArray($node['id']);

    );

    $html .= '<dd>';
    $html .= getTreeHTML($tree_last,$level);
    $html .= '</dd>';

    functionformatTree($array,$pid= 0,$level= 1,$field=array('pid'=>'pid','id'=>'id','children'=>'children')){

    }
    $html .= '</dl>';
    }
    }
    return $html;
    }

        $arr=array();

    $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>';

        foreach($arrayas&$v) {

    ?>
    </body>
    </html>

          if($v[$field['pid']] ==$pid) {

            $v['level'] =$level;

            $tem= formatTree($array,$v[$field['id']],$v['level']+1,$field);

            //推断是还是不是存在子数组

            $tem&&$v[$field['children']] =$tem;

            $arr[] =$v;

          }

        }

        return$arr;

      }

    $tree= formatTree($arr,0,1,$field=array('pid'=>'pid','id'=>'cid','children'=>'children') );

    echo'

    '
    

    print_r($tree);

    ?> 

     

    咱俩有三个格局来进展软件设计:多个是让其丰富的总结以致于让BUG不恐怕藏身;另三个便是让其丰裕的头昏眼花,令人找不到BUG。后面一个更难一些。

    本文由澳门402永利com发布于计算机 网络,转载请注明出处:php数组转换成树的几个例子,php生成无限栏目树

    关键词:

上一篇:函数说明,函数用法介绍

下一篇:没有了