2010-11-10 47 views
1

我正在研究菜單系統,並且正在處理一些複雜的問題。該菜單由數組生成。這個數組包含在一個pastebin中,因爲它真的很大。我想在數組中搜索,並獲取我正在搜索的值的層次結構路徑,同時還可以獲取您運行低谷的父代旁邊的值。正如我所說的那樣相當複雜。搜索具有相關值的數組路徑

在引擎收錄是我想要函數返回數組和結果:

-->pastebin<--

我試着寫這個功能了好幾次,但總是會卡在中間。

+1

我會說這是一個比較難看的導航實施。隨着它變得越來越大,它將越來越難保持。你可能想以某種方式重寫這個。 – 2010-11-10 15:38:24

+0

@ Silverlight:這樣做的原因是爲了避免爲每個父母進行多個查詢。最終,這是構建導航最快,最乾淨的方式,無需擔心網頁製作40多個查詢。如果你知道更好的東西,你可以自由告訴我。 – RJD22 2010-11-10 15:42:57

回答

1

這裏是一個函數:

function get_item_recursive($id, $menu_array = array()) 
{ 
    foreach($menu_array as $menu_item) 
    { 
     if(isset($menu_item['id']) && $menu_item['id'] == $id) 
     { 
      $menu_item['subitems'] = array(); 
      return $menu_item; 
     } 
     else 
     { 
      if(isset($menu_item['subitems']) && !empty($menu_item['subitems'])) 
      { 
       $found = get_item_recursive($id, $menu_item['subitems']); 
       if($found) 
       { 
        return $menu_item; 
       } 
      } 
     } 
    } 
    return FALSE; 
} 

我沒有測試過,但是這是想法。

+0

這就是我正在尋找的 – RJD22 2010-11-11 10:09:40

0

你基本上是在尋找像麪包屑一樣的東西嗎?您可以使用該遞歸函數:

function findPath($haystack, $id, $parents = array()) { 
    foreach ($haystack as $k => $v) { 
     if ($v['id'] == $id) { 
     return array_merge($parents, array($v)); 
     } else if (!empty($v['subitems'])) { 
     unset($v['subitems']); 
     $return = findPath(
      $haystack[$k]['subitems'], 
      $id, 
      array_merge($parents, array($v)) 
     ); 
     if ($return) return $return; 
     } 
    } 
    return false; 
} 

執行此功能是這樣的:

findPath($haystack, 11); 

將返回:

Array (
    [in-balans] => Array 
     (
     [id] => 2 
     [slug] => in-balans 
     [title] => In balans 
    ) 
    [arbodienstverlening] => Array 
     (
     [id] => 10 
     [slug] => arbodienstverlening 
     [title] => Arbodienstverlening 
    ) 
    [arbo] => Array 
     (
     [id] => 11 
     [slug] => arbo 
     [title] => Arbo 
     [subitems] => 
    ) 
)