dpj96988 2016-04-12 00:23
浏览 47
已采纳

递归PHP数组

I have the following problem. I want to find these values in the array and when other than true or does not exist, remove the array

example:

$array =array(
            array(
                'menu'  => 'hide',
                'label' => 'Notice',
                'class' => 'menu-icon fa fa-newspaper-o',
                'route' => 'notice',
                'action'=> 'index',
            ),

            array(
                'label' => 'Nivel',
                'class' => 'menu-icon fa fa-file-text-o',
                'uri'   => '#',
                'pages' => array(
                    array(
                        'label' => 'Tur',
                        'pages' => array(
                            array(
                                'menu'   => 'hide',
                                'label'  => 'Content',
                                'route'  => 'g7t',
                                'action' => 'index',
                                'params' => array(
                                    'nivel' => 'gdfa',
                                ),
                            ),
                            array(
                                'menu'   => 'hide',
                                'label'  => 'Plan',
                                'route'  => 'plan',
                                'action' => 'index',
                                'params' => array(
                                    'nivel' => 'gdr',
                                ),
                            ),
                            array(
                                'menu'   => 'hide',
                                'label'  => 'Lan',
                                'action' => 'index',
                                'params' => array(
                                    'nivel' => 'bcn',
                                ),
                                'pages' => array(
                                    array(
                                        'menu'   => 'hide',
                                        'label'  => 'lan2',
                                        'route'  => 'lan2',
                                        'action' => 'list',
                                        'params' => array(
                                            'nivel' => 'gr',
                                        ),
                                    ),
                                ),
                            ),
                            array(
                                'menu'   => 'hide',
                                'label'  => 'notes',
                                'route'  => 'notes',
                                'action' => 'index',
                                'params' => array(
                                    'nivel' => 'gran',
                                ),
                            ),

                        ),
                    ),
                    array(
                        'label' => 'Disp',
                        'route' => '/',
                    ),
                ),
            ),
        );

now I want to take these positions the array:

   $arrayfilter= [
        'Content'            => true,
        'Disp'               => false,
        'lan2'               => true,
        'Plan'               => false,
        'notes'              => true,
        'Nivel'              => true,
        'Lan'                => true,
    ];

now would be that way

array(
         array(
            'label' => 'Nivel',
            'class' => 'menu-icon fa fa-file-text-o',
            'uri'   => '#',
            'pages' => array(
                array(
                    'label' => 'Tur',
                    'pages' => array(
                        array(
                            'menu'   => 'hide',
                            'label'  => 'Content',
                            'route'  => 'g7t',
                            'action' => 'index',
                            'params' => array(
                                'nivel' => 'gdfa',
                            ),
                        ),
                        array(
                            'menu'   => 'hide',
                            'label'  => 'Lan',
                            'action' => 'index',
                            'params' => array(
                                'nivel' => 'bcn',
                            ),
                            'pages' => array(
                                array(
                                    'menu'   => 'hide',
                                    'label'  => 'lan2',
                                    'route'  => 'lan2',
                                    'action' => 'list',
                                    'params' => array(
                                        'nivel' => 'gr',
                                    ),
                                ),
                            ),
                        ),
                        array(
                            'menu'   => 'hide',
                            'label'  => 'notes',
                            'route'  => 'notes',
                            'action' => 'index',
                            'params' => array(
                                'nivel' => 'gran',
                            ),
                        ),

                    ),
                ),

            ),
        ));
  • 写回答

2条回答 默认 最新

  • dougai0138 2016-04-12 01:59
    关注

    Had some free time so I created a loop..

    A not so clean solution, I don't recommend it but this will work based on your output above.

    foreach($array as $key1 => $levelOne) {
        echo $key1."<br/>";
        if(is_array($levelOne)) {
            foreach($levelOne as $key2 => $levelTwo) {
                echo "leveloneLoop ".$key2."<br/>";
    
                if( $key2 == "label" && ((array_key_exists($levelOne['label'],$arrayfilter) && !$arrayfilter[$levelOne['label']])
                    || !array_key_exists($levelOne['label'],$arrayfilter)) ) {
                    echo "delete array['".$key1."']<br/>";
                    unset($array[$key1]);
                }
    
                // loop to $pages ($pages, $route)                      
                foreach($levelTwo as $key3 => $levelThree) {
                    foreach($levelThree as $key4 => $levelFour) {                       
                        echo "levelThreeLoop ".$key4."<br/>";
                        if( $key4 == "label" && ((array_key_exists($levelThree['label'],$arrayfilter) && !$arrayfilter[$levelThree['label']])
                            || !array_key_exists($levelThree['label'],$arrayfilter)) ) {
    
                            echo "delete array['".$key1."']['".$key2."']['".$key3."']['".$key4."']<br/>";
                            unset($array[$key1][$key2][$key3]);
                        }
                        foreach($levelFour as $key5 => $levelFive) {
                            foreach($levelFive as $key6 => $levelSix) {
    
    
                                if( $key6 == "label" && ((array_key_exists($levelFive['label'],$arrayfilter) && !$arrayfilter[$levelFive['label']])
                                    || !array_key_exists($levelFive['label'],$arrayfilter)) ) {
                                    echo "delete array['".$key1."']['".$key2."']['".$key3."']['".$key4."']['".$key5."']<br/>";
                                    unset($array[$key1][$key2][$key3][$key4][$key5]);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    

    Noticed that you also haven't added Tur on your filter, so I added it.

    $arrayfilter= [
        'Content'            => true, 
        'Disp'               => false, 
        'lan2'               => true, 
        'Plan'               => false, 
        'notes'              => true, 
        'Nivel'              => true,
        'Lan'                => true,
        'Tur'                => true
    ];
    

    If you want to go deeper, then just add a loop.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗