多维数组(2)

时间:2010-09-13 16:30:27

标签: php multidimensional-array

我有这个数组,我无法遍历:

print_r($ menu)给出了这个:

[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的漂移。

4 个答案:

答案 0 :(得分:3)

消息存在,因为在您的示例中,只有一个第一级元素定义了“子菜单”键。即,最后一个。对于其他所有钥匙丢失的人。

替换

is_array($section_array['submenu']))

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

它应该可以正常工作。

答案 1 :(得分: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>

答案 2 :(得分:1)

您将在前几个链接(仪表板和网站)上收到错误,但是由于存在子菜单,因此它应该适用于定价。通过检查以确保子菜单首先存在,尝试使if语句更复杂:

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

答案 3 :(得分: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;
}