2016-04-12 28 views
0

私は以下の問題があります。私は、配列内のこれらの値を見つけたいとするとき、真以外、または存在しません、配列再帰PHP配列

例取り除く:

$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' => '/', 
        ), 
       ), 
      ), 
     ); 

を今私はこれらの位置に配列撮りたい:

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

は今、私が編曲を受け付ける関数で始まる示唆

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

        ), 
       ), 

      ), 
     )); 

答えて

1

Aそれほどきれいではない解決策..ので、私はループを作成し、いくつかの自由な時間を持っていた、私はそれをお勧めしませんが、これは上記のあなたの出力に基づいて動作します。

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]); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

はまた、あなたのフィルターにTurを追加していないことに気づいたので、私はこれを追加しました。

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

さらに深く移動したい場合は、ループを追加するだけです。

0

その方法だろうayを引数として、この配列の要素をループし、ツリー内で1レベル深く進む必要がある場合には、再帰的に自身を呼び出します。あなたは 'ページ'サブアレイを持っています)、参照によって要素を渡します。 深く進む必要がない場合は、 'leaf'ノードがフィルタ条件と一致していることを確認し、一致しない場合はunset()を解除してください。