三级数组查询

$data = db::name('AuthRule')->select();
$data = list_to_tree2($data,'id','pid');//aaa($data);
// halt($data);
$this->assign("nodeList", $data);
return $this->fetch();

 

/**
 * 把返回的数据集转换成Tree
 * @access public
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 */
function list_to_tree2($list, $pk='id',$pid = 'pid',$child = '_child',$root=0) {
    // 创建Tree
    $tree = array();
    if(is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];//取出每个栏目id作为键名,
        }
        foreach ($list as $key => $data) {//开始循环,key从0开始一个一个往下走0123.。。
            // 判断是否存在parent
            $parentId = $data[$pid];//echo $parentId.'|';//0|112|116|117|112输出每个数组里的pid
            if ($root == $parentId) {//key从0开始循环,如果是一级栏目pid==0
                $tree[] =& $list[$key]; //用连接符,吧数组放到tree里面
            }else{
            //如果pid不是0,那就是二级栏目
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];//用pid去refer数组,匹配出父栏目数组,用连接符拼接到这里
                    $parent[$child][] =& $list[$key];aaa($parent);//将当前二级栏目放到父栏目下,拼接成二维数组
                }
            //仔细看list数组数据格式,第一遍key是0开始循环走的是tree哪里,
            //第二遍从1开始走,走到parent这里,
            }
        }
    }
    return $tree;
}

打印出的数据格式:

 

 

$list = Array
(
    [0] => Array
        (
            [id] => 112
            [name] => /Admin
            [title] => 后台
            [type] => 1
            [node_icon] => 
            [class_icon] => 
            [status] => 1
            [condition] => 
            [sort] => 0
            [pid] => 0
            [level] => 1
            [update_time] => 1532081114
            [create_time] => 1510821470
            [is_display] => 1
        )

    [1] => Array
        (
            [id] => 117
            [name] => /Admin/Index/index
            [title] => 后台首页
            [type] => 1
            [node_icon] => 
            [class_icon] => 
            [status] => 1
            [condition] => 
            [sort] => 0
            [pid] => 116
            [level] => 3
            [update_time] => 1510821714
            [create_time] => 1510821714
            [is_display] => 1
        )
}

$refer = Array
(
    [112] => Array
        (
            [id] => 112
            [name] => /Admin
            [title] => 后台
            [type] => 1
            [node_icon] => 
            [class_icon] => 
            [status] => 1
            [condition] => 
            [sort] => 0
            [pid] => 0
            [level] => 1
            [update_time] => 1532081114
            [create_time] => 1510821470
            [is_display] => 1
        )

    [117] => Array
        (
            [id] => 117
            [name] => /Admin/Index/index
            [title] => 后台首页
            [type] => 1
            [node_icon] => 
            [class_icon] => 
            [status] => 1
            [condition] => 
            [sort] => 0
            [pid] => 116
            [level] => 3
            [update_time] => 1510821714
            [create_time] => 1510821714
            [is_display] => 1
        )
)

$tree = Array
(
    [0] => Array
        (
            [id] => 112
            [name] => /Admin
            [title] => 后台
            [type] => 1
            [node_icon] => 
            [class_icon] => 
            [status] => 1
            [condition] => 
            [sort] => 0
            [pid] => 0
            [level] => 1
            [update_time] => 1532081114
            [create_time] => 1510821470
            [is_display] => 1
        )

)


$parent = Array
(
    [id] => 116
    [name] => /Admin/Index
    [title] => 首页
    [type] => 1
    [node_icon] => 
    [class_icon] => 
    [status] => 1
    [condition] => 
    [sort] => 1
    [pid] => 112
    [level] => 2
    [update_time] => 1510821685
    [create_time] => 1510821685
    [is_display] => 1
    [is_status] => 1
    [_child] => Array
        (
            [0] => Array
                (
                    [id] => 117
                    [name] => /Admin/Index/index
                    [title] => 后台首页
                    [type] => 1
                    [node_icon] => 
                    [class_icon] => 
                    [status] => 1
                    [condition] => 
                    [sort] => 0
                    [pid] => 116
                    [level] => 3
                    [update_time] => 1510821714
                    [create_time] => 1510821714
                    [is_display] => 1
                    [is_status] => 1
                )

        )

)

  

 页面:

<dt>管理权限</dt>
<dd>
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="tab rules-data" data-rules="{present name ="$info['rules']"}{$info['rules']}{/present}">
{foreach name="nodeList" item="level1"}
<tr>
    <td style="font-size: 14px;"><label><input name="rules[]" level="1" type="checkbox" obj="node_{$level1.id}" value="{$level1.id}" data="{$level1.id}:1:0" data-id="{$level1.id}" data-pid="0"/> <b class="mac-size">[项目]</b> {$level1.title}</label></td>
</tr>
{present name="level1['_child']"}
{foreach name="level1['_child']" item="level2" }                         
    <tr>
        <td style="padding-left:60px; font-size: 14px;"><label><input name="rules[]" level="2" type="checkbox" obj="node_{$level1.id}_{$level2.id}" value="{$level2.id}"  data="{$level2.id}:2:{$level2.pid}" data-id="{$level2.id}" data-pid="{$level2.pid}"/> <b class="mac-size">[模块]</b> {$level2.title}</label></td>
    </tr>
	{present  name="$level2['_child']"}
	    {volist name="level2['_child']" id="level3"} 
	    <tr ><td style="padding-left: 120px;">
	    	<label><input name="rules[]" level="3" type="checkbox" obj="node_{$level1.id}_{$level2.id}_{$level3.id}" value="{$level3.id}" data="{$level3.id}:3:{$level3.pid}" data-id="{$level3.id}" data-pid="{$level3.pid}"/>  <b class="mac-size">[操作]</b>{$level3.title}</label>
	    </td></tr>
             {present  name="$level3['_child']"} 
           	<tr>
    		  <td style="padding-left: 160px;">
           	    {foreach name="level3['_child']" item="level4" key="k" }
           	    {if condition="$level4.is_display eq 1"}|   {/if}
					<label>
						<input name="rules[]" level="4" type="checkbox" obj="node_{$level1.id}_{$level2.id}_{$level3.id}_{$level4.id}" value="{$level4.id}" data="{$level4.id}:4:{$level4.pid}" data-id="{$level4.id}" data-pid="{$level4.pid}"/> {$level4.title}    
					</label> 
           	    {/foreach}
           	  </td>
			</tr> 
           {/present}
        {/volist} 
   {/present}
{/foreach}
{/present}
{/foreach}

  

posted @ 2018-08-01 17:31  御世制人  阅读(430)  评论(0编辑  收藏  举报