简体   繁体   English

使用php过滤数组以生成菜单树

[英]Filter array to generate menu tree using php

 $this->loadModel('Menu');
        $this->loadModel('SubMenu');
        $this->loadModel('SubSubMenu');
        $options['joins'] = array(
            array('table' => 'sub_menus',
                'alias' => 'sub_menus',
                'type' => 'LEFT',
                'conditions' => array(
                    'sub_menus.menu_id = Menu.id'
                )
            ),
            array('table' => 'sub_sub_menus',
                'alias' => 'sub_sub_menus',
                'type' => 'LEFT',
                'conditions' => array(
                    'sub_sub_menus.sub_menu_id = sub_menus.id'
                )
            )
        );
        $options['fields'] = array('Menu.id','Menu.name', 'Menu.action', 'sub_menus.id','sub_menus.name', 'sub_menus.action','sub_sub_menus.id', 'sub_sub_menus.name', 'sub_sub_menus.action');
        $menus = $this->Menu->find('all', $options);

$menus array is like this: $ menus数组是这样的:

Array
(
    [0] => Array
        (
            [Menu] => Array
                (
                    [id] => 6
                    [name] => Bangladesh
                    [action] => bangladesh
                )

            [sub_menus] => Array
                (
                    [id] => 2
                    [name] => Politics
                    [action] => politics
                )

            [sub_sub_menus] => Array
                (
                    [id] => 1
                    [name] => submenu2
                    [action] => test
                )

        )

    [1] => Array
        (
            [Menu] => Array
                (
                    [id] => 9
                    [name] => Entertainment
                    [action] => entertainment
                )

            [sub_menus] => Array
                (
                    [id] => 19
                    [name] => Music
                    [action] => music
                )

            [sub_sub_menus] => Array
                (
                    [id] => 19
                    [name] => test
                    [action] => test1
                )

        )

    [2] => Array
        (
            [Menu] => Array
                (
                    [id] => 6
                    [name] => Bangladesh
                    [action] => bangladesh
                )

            [sub_menus] => Array
                (
                    [id] => 2
                    [name] => Politics
                    [action] => politics
                )

            [sub_sub_menus] => Array
                (
                    [id] => 20
                    [name] => AML
                    [action] => aml
                )

        )

    [3] => Array
        (
            [Menu] => Array
                (
                    [id] => 13
                    [name] => Comments
                    [action] => comments
                )

            [sub_menus] => Array
                (
                    [id] => 35
                    [name] => Issuse
                    [action] => issuse
                )

        )

    [4] => Array
        (
            [Menu] => Array
                (
                    [id] => 6
                    [name] => Bangladesh
                    [action] => bangladesh
                )

            [sub_menus] => Array
                (
                    [id] => 2
                    [name] => Politics
                    [action] => politics
                )

            [sub_sub_menus] => Array
                (
                    [id] => 22
                    [name] => One
                    [action] => one
                )

        )

)

My expected array is: 我期望的数组是:

Array
(
    [0] => Array
        (
            [Menu] => Array
                (
                    [id] => 6
                    [name] => Bangladesh
                    [action] => bangladesh
                )

            [sub_menus] => Array
                (
                  [0] => Array
                      (
                          [id] => 2
                          [name] => Politics
                          [action] => politics
                          [sub_menu2] => Array
                          (
                            [0] => Array
                            (
                              [id] => 1
                              [name] => submenu2
                              [action] => test 
                            )
                            [1] => Array
                            (
                              [id] => 20
                              [name] => AML
                              [action] => aml
                            ) 
                            [2] => Array
                            (
                              [id] => 22
                              [name] => One
                              [action] => one
                            )                 
                          )
                      )
                )
      )

    [1] => Array
        (
            [Menu] => Array
                (
                        [id] => 9
                        [name] => Entertainment
                        [action] => entertainment
                )

            [sub_menus] => Array
                (
                  [0] => Array
                      (
                           [id] => 19
                           [name] => Music
                           [action] => music
                          [sub_menu2] => Array
                          (
                            [0] => Array
                            (
                              [id] => 19
                              [name] => test
                              [action] => test1
                            )                
                          )
                      )
                )
      )

    [2] => Array
        (
            [Menu] => Array
                (
                        [id] => 13
                        [name] => Comments
                        [action] => comments
                )

            [sub_menus] => Array
                (
                  [0] => Array
                      (
                        [id] => 35
                        [name] => Issuse
                        [action] => issuse
                      )
                )
      )
)

Here What I want is tree menu generation using filtering array. 这里我想要的是使用过滤数组生成树形菜单。 All sub_menu will be wrapped by menu having same menu[id] and all sub_sub_menu will be wrapped by sub_menu having same sub_menu[id]. 所有sub_menu将被具有相同菜单[id]的菜单包裹,并且所有sub_sub_menu将被具有相同sub_menu [id]的sub_menu包裹。 I trying for couple of day but no luck. 我试了几天但没有运气。 I am sorry if it is very basic question or something like one that should not be asked here. 我很抱歉,如果这是一个非常基本的问题或类似的东西,不应该在这里问。 Thanks in advance. 提前致谢。

Visit here https://eval.in/436359 Not sure how to get this done, though, so this is a partial answer, but hopefully it sends you in the right direction. 访问这里https://eval.in/436359不知道如何完成这项工作,所以这是一个部分答案,但希望它能为您提供正确的方向。 Use this code. 使用此代码。

$filteredMenu = array();
$temp1 = array();
$unique = array();
$unique1 = array();
$index = 0;
$index2 = 0;
foreach ($menus as $key => $menu) {
  $pm = $menu['Menu']['name'];
  $pm1 = $menu['sub_sub_menus']['name'];
 if (isset($unique[$pm]) || array_key_exists($pm, $unique)) { 

if (!empty($menu['sub_menus']['name'])) {
    if(!empty($menu['sub_sub_menus']['name'])){

    if (isset($unique1[$pm1])) {  
         $temp1[$index2]= array('name' => $menu['sub_sub_menus']['name'], 'action' => $menu['sub_sub_menus']['action']);

    $temp = array('name' => $menu['sub_menus']['name'], 'action' => $menu['sub_menus']['action'], 'sub_menu2' => $temp1 );
    $filteredMenu[$index]['Sub_menu'][] = $temp;
    }

   // $filteredMenu[$index]['Sub_menu']['sub_menu2'][] = $temp;



    }
    else {
        $temp = array('name' => $menu['sub_menus']['name'], 'action' => $menu['sub_menus']['action']);
    $filteredMenu[$index]['Sub_menu'][] = $temp;
    }
  }
 }else {
if ($key != 0)
    $index++;
$unique[$pm] = 'set';

  //  $unique1[$pm1] = 'set';


$temp = array('name' => $pm, 'action' => $menu['Menu']['action']);
$filteredMenu[$index]['Menu'] = $temp;

 if (!empty($menu['sub_menus']['name'])) {
    if(!empty($menu['sub_sub_menus']['name'])){

        //if (isset($unique1[$pm1])) {
        if ($key != 0)
    $index2++;
        $unique1[$pm1] = 'set';
         $temp1[$index2] = array('name' => $menu['sub_sub_menus']['name'], 'action' => $menu['sub_sub_menus']['action']);
    $temp = array('name' => $menu['sub_menus']['name'], 'action' => $menu['sub_menus']['action'], 'sub_menu2' => $temp1 );
    $filteredMenu[$index]['Sub_menu'][] = $temp;

   // $filteredMenu[$index]['Sub_menu']['sub_menu2'][] = $temp;
       // }
    }
    else {
        $temp = array('name' => $menu['sub_menus']['name'], 'action' => $menu['sub_menus']['action']);
    $filteredMenu[$index]['Sub_menu'][] = $temp;
    }
  } 
 }
 }
 print_r($filteredMenu);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM