原始数据

$array = array(
    array('id' => 1, 'pid' => 0, 'n' => '河北省'),
    array('id' => 2, 'pid' => 0, 'n' => '北京市'),
    array('id' => 3, 'pid' => 1, 'n' => '邯郸市'),
    array('id' => 4, 'pid' => 2, 'n' => '朝阳区'),
    array('id' => 5, 'pid' => 2, 'n' => '通州区'),
    array('id' => 6, 'pid' => 4, 'n' => '望京'),
    array('id' => 7, 'pid' => 4, 'n' => '酒仙桥'),
    array('id' => 8, 'pid' => 3, 'n' => '永年区'),
    array('id' => 9, 'pid' => 1, 'n' => '武安市'),
    array('id' => 10, 'pid' => 8, 'n' => '永年区镇'),
    array('id' => 11, 'pid' => 0, 'n' => '上海市')
);

 

生成无限极分类

/** 所有的分类
 * @parem $array 数组
 * @parem $pid ,最高级别,默认为0,输出从pid 级别的数据
 * @parem $level 层级,默认0
 * */
function getTree($array, $pid =0, $level = 0){

    $f_name=__FUNCTION__; // 定义当前函数名

    //声明静态数组,避免递归调用时,多次声明导致数组覆盖
    static $list = [];

    foreach ($array as $key => $value){
        //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
        if ($value['pid'] == $pid){
            //父节点为根节点的节点,级别为0,也就是第一级
            $flg = str_repeat('|--',$level);
            // 更新 名称值
            $value['n'] = $flg.$value['n'];
            // 输出 名称
            echo $value['n']."<br/>";
            //把数组放到list中
            $list[] = $value;
            //把这个节点从数组中移除,减少后续递归消耗
            unset($array[$key]);
            //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
            $f_name($array, $value['id'], $level+1);
        }
    }
    return $list;
}
// 调用
$list=getTree($array);

调用结果:

河北省
|--邯郸市
|--|--永年区
|--|--|--永年区镇
|--武安市
北京市
|--朝阳区
|--|--望京
|--|--酒仙桥
|--通州区

 

嵌套标签,前端可以(通过选取子节点)全选、取消全选

function getTree($array, $pid =0, $level = 0){

    $f_name=__FUNCTION__; // 定义当前函数名

    // 空数组 不在执行
    if(empty($array))
        return;

    //声明静态数组,避免递归调用时,多次声明导致数组覆盖
    static $html;
    $html.="<ul>";
    
    foreach ($array as $key => $value){

        //第一次遍历,找到父节点为根节点的节点 也就是pid=0的节点
        if ($value['pid'] == $pid){
            //父节点为根节点的节点,级别为0,也就是第一级
            $flg = str_repeat('|--',$level);
            // 更新 名称值
            $value['n'] = $flg.$value['n'];
            $html.=$temp="<li><input type=\"checkbox\" name=\"limit_id[]\" value='".$value['id']."' >".$value['n'];

            //把这个节点从数组中移除,减少后续递归消耗
            unset($array[$key]);
            //开始递归,查找父ID为该节点ID的节点,级别则为原级别+1
            $vv=$f_name($array, $value['id'], $level+1);

            // 如果顶级分类下没有一个下级,删除此分类,此步骤可以省略
            if(empty($vv) && ($pid<1))
            {
                $html=str_replace($temp,'',$html);
            }
            $html.="</li>\r\n";

        }
    }
    $html.="</ul>\r\n";

    // 删除多余的 ul 标签
    $html=str_replace("<ul></ul>",'',$html);
    return $html;
}

html 输出结果

<ul>
    <li><input type="checkbox" name="limit_id[]" value='1'>河北省
        <ul>
            <li><input type="checkbox" name="limit_id[]" value='3'>|--邯郸市
                <ul>
                    <li><input type="checkbox" name="limit_id[]" value='8'>|--|--永年区
                        <ul>
                            <li><input type="checkbox" name="limit_id[]" value='10'>|--|--|--永年区镇
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
            <li><input type="checkbox" name="limit_id[]" value='9'>|--武安市
            </li>
        </ul>
    </li>
    <li><input type="checkbox" name="limit_id[]" value='2'>北京市
        <ul>
            <li><input type="checkbox" name="limit_id[]" value='4'>|--朝阳区
                <ul>
                    <li><input type="checkbox" name="limit_id[]" value='6'>|--|--望京
                    </li>
                    <li><input type="checkbox" name="limit_id[]" value='7'>|--|--酒仙桥
                    </li>
                </ul>
            </li>
            <li><input type="checkbox" name="limit_id[]" value='5'>|--通州区
            </li>
        </ul>
    </li>
    </li>
</ul>
View Code 

相关文章: