2010-09-13 153 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; 
}