2010-04-10 38 views
2

我有这是基于下面的阵列上的嵌套树结构:(?递归)遍历多维数组,并删除某些键

 
Array 
(
    [1] => Array 
     (
      [id] => 1 
      [parent] => 0 
      [name] => Startpage 
      [uri] => 125 
      [basename] => index.php 
      [child] => 
     ) 

    [23] => Array 
     (
      [id] => 23 
      [parent] => 0 
      [name] => Events 
      [uri] => 0 
      [basename] => 
      [child] => Array 
       (
        [24] => Array 
         (
          [id] => 24 
          [parent] => 23 
          [name] => Public news 
          [uri] => 0 
          [basename] => 
          [child] => Array 
           (
            [27] => Array 
             (
              [id] => 27 
              [parent] => 24 
              [name] => Add 
              [uri] => 100 
              [basename] => news.public.add.php 
              [child] => 
             ) 

            [28] => Array 
             (
              [id] => 28 
              [parent] => 24 
              [name] => Overview 
              [uri] => 101 
              [basename] => news.public.overview.php 
              [child] => 
             ) 

           ) 

         ) 

        [25] => Array 
         (
          [id] => 25 
          [parent] => 23 
          [name] => Private news 
          [uri] => 0 
          [basename] => 
          [child] => Array 
           (
            [29] => Array 
             (
              [id] => 29 
              [parent] => 25 
              [name] => Add 
              [uri] => 67 
              [basename] => news.private.add.php 
              [child] => 
             ) 

            [30] => Array 
             (
              [id] => 30 
              [parent] => 25 
              [name] => Overview 
              [uri] => 68 
              [basename] => news.private.overview.php 
              [child] => 
             ) 

           ) 

         ) 

        [26] => Array 
         (
          [id] => 26 
          [parent] => 23 
          [name] => Calendar 
          [uri] => 0 
          [basename] => 
          [child] => Array 
           (
            [31] => Array 
             (
              [id] => 31 
              [parent] => 26 
              [name] => Add 
              [uri] => 69 
              [basename] => news.event.add.php 
              [child] => 
             ) 

            [32] => Array 
             (
              [id] => 32 
              [parent] => 26 
              [name] => Overview 
              [uri] => 70 
              [basename] => news.event.overview.php 
              [child] => 
             ) 

           ) 

         ) 

       ) 

     ) 
)

我正在寻找一个函数来遍历该数组并删除一些键。

我我的系统可以让用户对某些功能/页,如果我拒绝访问整个“块”,“活动”,阵列将是这样的:

array (
    1 => 
    array (
    'id' => '1', 
    'parent' => '0', 
    'name' => 'Start page', 
    'uri' => '125', 
    'basename' => 'index.php', 
    'child' => '', 
), 
    23 => 
    array (
    'id' => '23', 
    'parent' => '0', 
    'name' => 'Events', 
    'uri' => '0', 
    'basename' => NULL, 
    'child' => 
    array (
     24 => 
     array (
     'id' => '24', 
     'parent' => '23', 
     'name' => 'Public news', 
     'uri' => '0', 
     'basename' => NULL, 
     'child' => '', 
    ), 
     25 => 
     array (
     'id' => '25', 
     'parent' => '23', 
     'name' => 'Private news', 
     'uri' => '0', 
     'basename' => NULL, 
     'child' => '', 
    ), 
     26 => 
     array (
     'id' => '26', 
     'parent' => '23', 
     'name' => 'Calendar', 
     'uri' => '0', 
     'basename' => NULL, 
     'child' => '', 
    ), 
    ), 
) 
)

正如你可以看到上面,整个“块”“事件”现在是无用的,因为没有与每个选项关联的页面。所以我需要找到所有的“键”,其中“basename”为空,并且其中子不是数组或数组是空的,并将其删除。 我发现搜索网站时,此功能:

function searchAndDestroy(&$a, $key, $val){ 
    foreach($a as $k => &$v){ 
     if(is_array($v)){ 
      $r = searchAndDestroy($v, $key, $val); 
      if($r) { 
       unset($a[$k]); 
      } 
     } elseif ($key == $k && $val == $v) { 
      return true; 
     } 
    } 
    return false; 
} 

它可以用来删除一个键上任何地方的阵中,但只设在一两件事,比如删除其中“父”等于“23的所有键”。但我需要找到并删除(取消设置)所有的键,其中“basename”为空,并且其中child不是数组或数组为空。 任何人都可以帮助我,并可能调整上面的功能?

谢谢

+0

最后他停止了写作:-) – 2010-04-10 10:49:34

+1

你可以用'var_export'而不是'print_r'来提供数组结构吗? – Gordon 2010-04-10 10:56:12

+0

@Parth你需要用鼠标滚轮加快速度。 – zaf 2010-04-10 13:36:29

回答

1

解决了!添加了这个功能,我的课:

private function cleanTree(&$arr){ 
    foreach($arr as $key => &$item) { 
     if(!$item["child"] && empty($item["basename"])){ 
      unset($arr[$key]);

}elseif(is_array($item["child"])){ 
     if(count($item["child"]) == 0){ 
      unset($arr[$item["id"]]); 
     }else{ 
      $this->cleanTree($item["child"]); 
     } 
    } 
} 

}

要删除根目录下(S)以及其他任何人不必要的元素,只需运行两次以上。

+1

如果无用物品下降3级,该怎么办? – outis 2010-04-10 20:22:32

1

而不是把测试的元素在搜索功能破坏,传递函数测试目标。

function searchAndDestroy(&$a, $targetp){ 
    foreach($a as $k => &$v){ 
     if(is_array($v)){ 
      searchAndDestroy($v, $targetp); 
     } 
     if ($targetp($k, $v)) { 
      unset($a[$k]); 
     } 
    } 
} 

searchAndDestroy($menu, function ($k, $v) { 
     return is_array($v) 
      && array_key_exists('basename', $v) && empty($v['basename']) 
      && (empty($v['child']) || count($v['child']) == 0); 
    }); 

对于PHP < 5.3(或者如果你打电话searchAndDestroy,在超过一个点该功能),命名功能,并通过名称,而不是一个匿名函数。