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',
),
),
),
),
),
));
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.
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.