牛骨文教育服务平台(让学习变的简单)
博文笔记

php无限分类与树形菜单

创建时间:2016-12-22 投稿人: 浏览次数:2028
<?php


namespace Applib;

/**
 * @name PHPTree
 * @author crazymus < QQ:291445576 >
 * @des PHP生成树形结构,无限多级分类
 * @version 1.2.0
 * @Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
 * @updated 2015-08-26
 */
class Tree
{

    protected static $config = array(
        /* 主键 */
        "primary_key"  => "id",
        /* 父键 */
        "parent_key"   => "pid",
        /* 展开属性 */
        "expanded_key" => "expanded",
        /* 叶子节点属性 */
        "leaf_key"     => "leaf",
        /* 孩子节点属性 */
        "children_key" => "children",
        /* 是否展开子节点 */
        "expanded"     => false
    );

    /* 结果集 */
    protected static $result = array();

    /* 层次暂存 */
    protected static $level = array();

    /**
     * @name 生成树形结构
     * @param array 二维数组
     * @return mixed 多维数组
     */
    public static function makeTree($data, $options = array())
    {
        $dataset = self::buildData($data, $options);
        $r       = self::makeTreeCore(0, $dataset, "normal");
        return $r;
    }

    /* 生成线性结构, 便于HTML输出, 参数同上 */
    public static function makeTreeForHtml($data, $options = array())
    {

        $dataset = self::buildData($data, $options);
        $r       = self::makeTreeCore(0, $dataset, "linear");
        return $r;
    }

    /* 格式化数据, 私有方法 */
    private static function buildData($data, $options)
    {
        $config       = array_merge(self::$config, $options);
        self::$config = $config;
        extract($config);

        $r = array();
        foreach ($data as $item) {
            $id                 = $item[$primary_key];
            $parent_id          = $item[$parent_key];
            $r[$parent_id][$id] = $item;
        }

        return $r;
    }

    /* 生成树核心, 私有方法  */
    private static function makeTreeCore($index, $data, $type = "linear")
    {
        extract(self::$config);
        foreach ($data[$index] as $id => $item) {
            if ($type == "normal") {
                if (isset($data[$id])) {
                    $item[$expanded_key] = self::$config["expanded"];
                    $item[$children_key] = self::makeTreeCore($id, $data, $type);
                } else {
                    $item[$leaf_key] = true;
                }
                $r[] = $item;
            } else if ($type == "linear") {
                $parent_id        = $item[$parent_key];
                self::$level[$id] = $index == 0 ? 0 : self::$level[$parent_id] + 1;
                $item["level"]    = self::$level[$id];
                self::$result[]   = $item;
                if (isset($data[$id])) {
                    self::makeTreeCore($id, $data, $type);
                }

                $r = self::$result;
            }
        }
        return $r;
    }
}

html显示调用代码:
echo "<h1>PHPTree树形结构</h1>";
echo "<select  style="width:300px;">";
foreach($r as $item){
	echo "<option>";
	//根据所在的层次缩进
	echo str_repeat("......",$item["level"]);
	echo $item["name"];
	echo "</option>";
}
echo "</select>";




声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。