我有这个数组,我无法遍历:
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的漂移。
答案 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但我认为在这种情况下你会从递归函数中获益。使用isset
或array_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;
}