0

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 Answers 2

1

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.

Sign up to request clarification or add additional context in comments.

Comments

0

I suggest starting with a function that accepts an Array as its argument, looping through the elements of this array, and recursively calls itself in case its required to go one level deeper in the tree (i.e. you have 'pages' sub-array), passing the element by reference. If its not required to go deeper, just check the 'leaf' node match the filter criteria and unset() it in case it doesn't.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.