2010-04-10 181 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,在超過一個點該功能),命名功能,並通過名稱,而不是一個匿名函數。