4
 $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:

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]. 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.

  • I would suggest you rethink your Object methods. Your source data is at least in my opinion not well suited to your needs at all, and will mostly likely become quite limiting in the future. Consider thinking in smaller pieces rather than just grabbing as much data as you can in one punch. I'm sorry this is not very definitive perhaps someone can give you a real answer. – Jim_M Sep 19 '15 at 19:46

1 Answers1

2

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. 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);
Lemon Kazi
  • 3,308
  • 2
  • 37
  • 67