konakona
[原创] PHP递归函数实现无限分类 (全代码+数据结构)实例示范
[原创] PHP递归函数实现无限分类 (全代码+数据结构)实例示范

我的功能比较庞大(一个专题功能中的无限个页面),先说下详细再看代码。

topic_info(基础表),topic_page(页面表)

 

基础表结构

页面表结构

其实接下来的程序中,并不会过多的使用到基础表,但也放出来,给大家了解下为什么接下来会有t_id这些非topic_page表的东西。

程序部分用的是Thinkphp2.1,懒的脱离出来用原始php写了,大家有一定php基础的人一定看得懂这种封装。

但有一点必须注意:
这里的递归最好用class,因为单纯的function无法满足,有bug(php的bug)。

http://blog.crazyphper.com/wp-content/uploads/2011/09/sss-300x67.jpg
最终效果如图,无限个页面。

程序中一共递归了2处,值得一提的是getPPCount()模型方法里的那次递归,引发了一个bug
如果直接return $getNum,值为null。
而且global $getNum也无效,所以不是局部变量或全局变量的问题。
只有通过赋值给类成员才可用。
至于变量引用这个方法我没试,觉得这样比用类成员解决问题更不靠谱。

所以这样已经是最好的办法了。

赞赏
首页      程序开发      PHP      [原创] PHP递归函数实现无限分类 (全代码+数据结构)实例示范
https://secure.gravatar.com/avatar/3b712b34a0e1b689cfb524c9c6bcdc47?s=256&r=g

团哥

文章作者

继续玩我的CODE,让别人说去。 低调,就是这么自信。

发表评论

textsms
account_circle
email

  • https://secure.gravatar.com/avatar/564d6bd6e577a0e1859a58a0aaf82c5f?s=80&r=g

    嘛 – – 这是我的。。。
    private function __get_type_struct($tid, $lid, $level, $hierprefix)
    {
    $rst = array();

    /** Hierarchy string */
    $last = $hierprefix . “┗”;
    $not_last = $hierprefix . “┣”;

    /** Gat data */
    $i = 0;
    $query = $this->db->where(array(“fatherid” => $tid))->order_by(“order”, “asc”)->get(“type”);
    foreach($query->result() as $row)
    {
    $next_herprefix = $hierprefix . (($i == $query->num_rows – 1) ? ”  ” : “┃”);

    $rst[$i] = (array)$row;
    $rst[$i][“child”] = $this->__get_type_struct($rst[$i][“tid”], $lid, $level + 1, $next_herprefix);
    $rst[$i][“child_count”] = count($rst[$i][“child”]);
    $rst[$i][“href”] = $this->config->item(“base_url”) . “/x_” . $rst[$i][“typeurl”];
    if($rst[$i][“issingle”] == 1) $rst[$i][“href”] .= $this->config->item(“url_suffix”);

    /** The EX type name of it’s language */
    $ex = $this->get_typename_ex($rst[$i][“tid”], $lid, NULL);
    if($ex != NULL) $rst[$i][“typename”] = $ex;

    /** Hierarchy name */
    $rst[$i][“hiername”] = (($i == $query->num_rows – 1) ? $last : $not_last) . $rst[$i][“typename”];
    $rst[$i][“hierprefix”] = ($i == $query->num_rows – 1) ? $last : $not_last;

    $i++;
    }

    return $rst;
    }

    /**
    *
    * @param $lid
    * @return
    */
    public function get_type_struct($lid)
    {
    /** ROOT INFORMATION */
    $struct[“tid”] = -1;
    $struct[“issingle”] = 1;
    $struct[“fatherid”] = -100;
    //$struct[“lid”] = $lid;
    $struct[“index_template_file”] = “content_index”;
    $struct[“list_template_file”] = “content_list”;
    $struct[“content_template_file”] = “content_content”;
    $struct[“typeurl”] = “…”;
    $struct[“group”] = -1;
    $struct[“order”] = 0;
    $struct[“typename”] = “[ROOT]”;
    $struct[“hiername”] = “[ROOT]”;
    $struct[“hierprefix”] = “”;
    $struct[“href”] = $this->config->item(“base_url”);

    $struct[“child”] = $this->__get_type_struct(-1, $lid, 1, “”);
    $struct[“child_count”] = count($struct[“child”]);
    //dump($struct);

    return $struct;
    }

    public function __get_type_struct_array($struct)
    {
    /** COPY CURRENT ONE */
    $this->type_struct_array[$this->type_struct_array_count] = $struct;
    unset($this->type_struct_array[$this->type_struct_array_count][“child”]);
    unset($this->type_struct_array[$this->type_struct_array_count][“child_count”]);

    $this->type_struct_array_count++;

    /** COPY CHILDREN */
    for($i = 0; $i __get_type_struct_array($struct[“child”][$i]);
    }
    }

    public function get_type_struct_array($lid)
    {
    $this->type_struct_array = array();
    $this->type_struct_array_count = 0;

    $struct = $this->get_type_struct($lid);
    $this->__get_type_struct_array($struct);

    return $this->type_struct_array;
    }

    8年前回复

konakona

[原创] PHP递归函数实现无限分类 (全代码+数据结构)实例示范
我的功能比较庞大(一个专题功能中的无限个页面),先说下详细再看代码。 topic_info(基础表),topic_page(页面表)   基础表结构 [crayon-5d2dc39cc9d8a246824244/] 页…
扫描二维码继续阅读
2011-09-08