<?php
class k_model_menu_menu

{

    private $data = array();

    private $rdata = array();

    private $jdata = array();

    private $level = 0;

    private $paret = array();

    function getOption($type= 'part',$pid = 0)

    {

        if($type = 'all') $this->data= R::getAll( 'select * from menu' );

        

        $this->teamData();

        

        if($this->rdata) return $this->rdata;

        return false;    

    }

    

    function addMenu($data){

        foreach($data as $key =>$value){

            if($value == '请填写内容!') $data[$key]='';

        }

        if($data){

            $menu = R::dispense('menu');

            $menu->pid = $data['pid'];

            $menu->name = $data['name'];

            $menu->url = $data['url'];

            $menu->icon = $data['icon'];

            $id = R::store($menu);

            return $id;

        }

    }

    //返回json 字符串

    public function getJsonMenu(){

        $data = $this->getChild(1);

        $this->jdata = $data;

        $this->recursive($this->jdata);

        return  json_encode($this->jdata);

    }

        

    //递归函数  实现不断的生成子节点,用了引用,感觉这引用是如来神笔,要不然实现太复杂了

    public function recursive(&$data = array()){

        foreach($data as $key =>$value){

            $data[$key]['children']= $this->getChild($value['id']);

            $tmp = &$data[$key]['children'];

            if($tmp){

                $this->recursive($tmp);

            }

        }

    }

    

    //组织数据,用于生成树形的select 返回的是一个数组

    //数组的形式是

        public function teamData($pid=1){

            foreach ($this->data as $key => $value) {    

                if($value['pid']==$pid){

                        $this->level++;

                        array_push($this->rdata, array('name'=>$value['name'],'level'=>$this->level,'id'=>$value['id']));

                                

                    $tmpdata = $this->teamData($value['id']);

                    if(!$tmpdata){

                        $this->level--;

                        continue;

                    }

                }

            }    

        }

        

    

    //根据pid拿取下面的子数据

    public function getChild($pid){

         $data=  R::getAll( "select * from menu where pid = {$pid}" );

         $tmpdata = array();

         if($data){

             foreach ($data as $key => $value) {

                 $tmpdata[$key]['id'] =  $value['id'];

                 $tmpdata[$key]['icon'] =  $value['icon'];

                 $tmpdata[$key]['text'] =  $value['name'];

                 $tmpdata[$key]['url'] =  $value['url'];

                 $tmpdata[$key]['children'] =  array();

             }

         }

         return $tmpdata;

    }

    

    

}

[置顶] 递归 加引用 实现tree 和 无限级菜单的更多相关文章

  1. [置顶] 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅

    转载请注明出处http://blog.csdn.net/xiaanming/article/details/9825113 异步加载图片的例子,网上也比较多,大部分用了HashMap<Strin ...

  2. 【置顶】Trotyl's OI tree

    \(\rm thx\):@\(\rm UntilMadow\) ! \(\color{Green}{\rm Pupil}\) :只会一点点 \(\color{blue}{\text{Expert}}\ ...

  3. [置顶] ※数据结构※→☆非线性结构(tree)☆============树结点 链式存储结构(tree node list)(十四)

    结点: 包括一个数据元素及若干个指向其它子树的分支:例如,A,B,C,D等. 在数据结构的图形表示中,对于数据集合中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,简称结点. 在C语言 ...

  4. [置顶] Flex中Tree组件无刷新删除节点

    在Tree组件中经常要删除某个节点,而删除之后重新刷新加载该Tree组件会影响整个操作效果和效率,因此,无刷新删除就比较好,既删除了节点也没有刷新tree,而使Tree的状态处于删除之前的状态. 无刷 ...

  5. Discuz常见小问题-如何批量加精,置顶帖子

    批量选中帖子,然后置顶和精华都可以勾选 完成之后的效果

  6. [置顶] Android开发笔记(成长轨迹)

    分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

  7. js上移、下移、置顶、置底功能实现

    实现页面上列表内容上移.下移.置顶.置底 功能,主要实现思路是节点操作,比如说:上移,直接把点击项移动到前一个节点,以此类推,当然实际代码实现还要加些判断,如当前点击操作项是否已经是置底或置底了,如果 ...

  8. [置顶]VC2013的一个bug

    [置顶]VC2013的一个bug 前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其 ...

  9. [置顶] 创建GitHub技术博客全攻略

    [置顶] 创建GitHub技术博客全攻略 分类: GitHub2014-07-12 13:10 19710人阅读 评论(21) 收藏 举报 githubio技术博客网站生成 说明: 首先,你需要注册一 ...

随机推荐

  1. 【转】使用NetBeans和Eclipse开发PHP应用程序

    [51CTO独家特稿]各位用户如果单独看NetBeans和Eclipse的市场占有率,你可能会认为使用其中任何一种IDE开发PHP应用程序都没有 问题,例如: 1.NetBeans:一款开源的集成开发 ...

  2. Js原型模式

    function Person(){ } Person.prototype.name = "xd"; Person.prototype.age = 26; Person.proto ...

  3. Nginx源码安装及调优配置

    导读 由于Nginx本身的一些优点,轻量,开源,易用,越来越多的公司使用nginx作为自己公司的web应用服务器,本文详细介绍nginx源码安装的同时并对nginx进行优化配置. Nginx编译前的优 ...

  4. Maximum Product Subarray JAVA实现

    题目描述: Find the contiguous subarray within an array (containing at least one number) which has the la ...

  5. 精雕细琢 35 套精美的 PSD 图标素材

    设计师总是有独特的创意和精雕细琢的精湛技术,让我们值得去欣赏和借鉴,如梦想天空所表达的:非常感谢那些很有才华的设计师分享它们的劳动成果,让更多的人可以使用他们的创意设计.今天,本文与大家分享35套精美 ...

  6. cocos2d-x 详解之 CCTexture2D(纹理图片)和 CCTextureCache(纹理缓存)

    精灵和动画都涉及到纹理图片的使用,所以在研究精灵与动画之前,我们先来了解一下纹理图片类CCTexture2D和纹理缓存CCTextureCache的原理: 当一张图片被加载到内存后,它是以纹理的形式存 ...

  7. C++ 之高效使用STL ( STL 算法分类)

    http://blog.csdn.net/zhoukuo1981/article/details/3452118

  8. java 复习003 之排序篇

    由java 复习003跳转过来的C语言实现版见some-sort-algorithms 快速排序(不稳定 O(n log n)) package vell.bibi.sort_algorithms; ...

  9. 有关OOM KILLER的一些理解

    Linux下有一种OOM KILLER 的机制,它会在系统内存耗尽的情况下,启用自己算法有选择性的kill 掉一些进程. 一.为什么会有OOM killer 当我们使用应用时,需要申请内存,即进行ma ...

  10. Spring Auto scanning components

    Normally you declare all the beans or components in XML bean configuration file, so that Spring cont ...