2010-09-13 114 views
1

我這陣,我有問題穿越:多維數組(2)

的print_r($菜單)給出了這樣的:

[Dashboard] => Array 
    (
     [uri] => dashboard 
     [access_level] => Full 
    ) 

[Web Site] => Array 
    (
     [uri] => website 
     [access_level] => Full 
    ) 

[Pricing] => Array 
    (
     [uri] => pricing 
     [access_level] => Full 
     [submenu] => Array 
      (
       [Change Pricing] => Array 
        (
         [uri] => pricing/change 
         [access_level_required] => Full 
        ) 

      ) 

    ) 

我試圖訪問每個使用的主要領域foreach循環。該部分工作正常,但我有問題訪問定價數組中的「子菜單」數組。

<ul> 
     <?php foreach($menu as $section_name=>$section_array): ?> 
      <li><?=anchor($section_array['uri'],$section_name)?> 
      <?php 

      if (is_array($section_array['submenu'])) echo 'its an array'; 

      ?></li> 
     <?php endforeach; ?> 
     </ul> 

現在我甚至不能告訴$ section_array ['submenu']是否是一個數組。我必須錯誤地訪問它,但我不知道爲什麼。我得到錯誤:「消息:未定義的索引:子菜單」

這是用CodeIgniter 1.7.2短標籤寫的,但你應該能夠趕上我的foreach漂移。

回答

3

的信息是那裏,因爲在你的例子只有第一級別的元素之一定義了「子菜單」鍵。也就是最後一個。對於所有其他缺少鑰匙的人。

更換

is_array($section_array['submenu'])) 

array_key_exists('submenu', $section_array) && is_array($section_array['submenu'])) 

,它應該工作的罰款。

+0

完美!我沒有意識到我需要使用array_key_exists,但它完全合理。謝謝! – muncherelli 2010-09-13 16:42:39

+0

完美答案Saul.My投票給你。 – 2010-09-14 13:29:30

1

子菜單隻存在於某個部分是問題。 它存在於Pricing數組中,而不是Dashboard或Web Site數組。一種選擇是圍繞它來包裝一個語句來檢查section_name,或者可能使用一個函數來檢查該數組名是否被定義。

 <ul> 
     <?php foreach($menu as $section_name=>$section_array): ?> 
      <li><?=anchor($section_array['uri'],$section_name)?> 
      <?php 
      if ($section_name == 'Pricing') 
      { 
       if (is_array($section_array['submenu'])) echo 'its an array'; 
      } 
      ?></li> 
     <?php endforeach; ?> 
     </ul> 
1

你會得到的前幾個環節(儀表板和網站)的錯誤,但那麼它應該在的定價,因爲子菜單中存在的工作。試着讓你的if語句通過檢查,以確保子菜單稍微複雜一點,即使第一存在:

if ($section_array['submenu'] && is_array($section_array['submenu'])){} 
+0

我試過了,我仍然得到「消息:未定義指數:子菜單」上其他的人。 – muncherelli 2010-09-13 16:41:11

0

通常我不喜歡混合PHP和HTML,但我認爲在這種情況下,您將從遞歸函數中獲益。使用issetarray_key_exists看關鍵是在一個數組:

function createMenuHTML($menu) { 
    $html = '<ul>'; 
    foreach($menu as $section_name=>$section_array) { 
     $html .= '<li>' . anchor($section_array['uri'],$section_name); 
     if(array_key_exists('submenu', $section_array)) { 
      $html .= createMenuHTML($section_array['submenu']); 
     } 
     $html .= '</li>'; 
    } 
    $html .= '</ul>'; 
    return $html; 
}