我有一个数组,其中包含在网站上构建导航菜单的数据。
这是它的设置方式:
$menu = array();
$menu['0']['label'] = 'Home';
$menu['0']['icon'] = 'fa-home';
$menu['0']['id'] = '';
$menu['0']['class'] = '';
$menu['0']['url'] = '/index.php';
$menu['0']['blank'] = 0;
$menu['1']['label'] = 'Admin';
$menu['1']['icon'] = 'fa-user';
$menu['1']['id'] = '';
$menu['1']['class'] = '';
$menu['1']['url'] = '#';
$menu['1']['blank'] = 0;
$menu['1']['0']['label'] = 'Notes';
$menu['1']['0']['icon'] = '';
$menu['1']['0']['id'] = '';
$menu['1']['0']['class'] = '';
$menu['1']['0']['url'] = '/notes.php';
$menu['1']['0']['blank'] = 0;
$menu['1']['1']['label'] = 'Testing';
$menu['1']['1']['icon'] = '';
$menu['1']['1']['id'] = '';
$menu['1']['1']['class'] = '';
$menu['1']['1']['url'] = '/testing.php';
$menu['1']['1']['blank'] = 0;
$menu['2']['label'] = 'Resources';
$menu['2']['icon'] = 'fa-thumb-tack';
$menu['2']['id'] = '';
$menu['2']['class'] = '';
$menu['2']['url'] = '#';
$menu['2']['blank'] = 0;
主导航菜单上显示$menu['0']
,$menu['1']
等。它们下面的任何数组,例如$menu['1']['0']
都是其父级下的子菜单。
我正在尝试检查数组上的每个主要元素,看看是否有子数组(如果有任何子菜单要创建)。
foreach ($menu as $item) {
if (is_array($item)) {
foreach ($item as $subitem) {
print_r($subitem); // See notes below
}
}
}
我想对print_r($subitem)
做的是想出一个像:
$subitem['label'] = 'Notes';
$subitem['icon'] = '';
$subitem['id'] = '';
$subitem['class'] = '';
$subitem['url'] = '/notes.php';
$subitem['blank'] = 0;
想法?
答案 0 :(得分:0)
你应该重组你的阵列:
$menu[0] = ['items' => [], 'submenus' => []];
所以所有菜单都有一个项目键和一个子菜单键。在子菜单数组中,您应该放置一个看起来完全相同的数组(即具有和'项目'键和'子菜单'键)。
这样你就可以只计算()子菜单键,并知道是否有任何子菜单要创建。如果您为菜单编写递归函数,它还可以让您根据需要嵌套它们。
例如:
<?php
// feed this an initialized menu, and an array of items
function addMenuItem($menu, $options) {
$newItem = makeMenu();
$newItem['items'] = $options;
$menu[] = $newItem;
return $menu;
}
// the parent menu is first, submenu second
function addSubMenu($menu, $pos, $subMenu) {
$menu[$pos]['submenus'][] = $subMenu;
return $menu;
}
// create a 'valid' but empty menu array
function makeMenu() {
return array('items' => array(), 'submenus' => array());
}
?>
作为旁注,这可以在Classes而不是函数和数组中很好地工作。
答案 1 :(得分:0)
我认为您当前的结构可能已经非常实用。以下是使用相同数据的循环的修改版本:
foreach ($menu as $parent_item) {
echo '<h2>Parent Items</h2>';
foreach ($parent_item as $key => $item) {
if (is_array($item)) {
echo '<br><h2>Subitems</h2>';
foreach ($item as $subkey => $subitem) {
echo "$subkey = $subitem<br>";
}
} else {
echo "$key = $item<br>";
}
}
echo '<br>';
}
这是输出:
答案 2 :(得分:0)
试试这段代码。这很容易管理。
$menu = array('menu1'=>array(
'label'=>'Home',
'icon'=>'fa-home',
'id'=>'',
'class'=>'',
'url'=>'/index.php',
'blank'=>0),
'menu2'=>array(
'label'=>'Home',
'icon'=>'fa-home',
'id'=>'',
'class'=>'',
'url'=>'/index.php',
'blank'=>0),
'menu3'=>array(
'label'=>'Home',
'icon'=>'fa-home',
'id'=>'',
'class'=>'',
'url'=>'/index.php',
'blank'=>0),
);
//print_r($menu);
Array
(
[menu1] => Array
(
[label] => Home
[icon] => fa-home
[id] =>
[class] =>
[url] => /index.php
[blank] => 0
)
[menu2] => Array
(
[label] => Home
[icon] => fa-home
[id] =>
[class] =>
[url] => /index.php
[blank] => 0
)
[menu3] => Array
(
[label] => Home
[icon] => fa-home
[id] =>
[class] =>
[url] => /index.php
[blank] => 0
)
答案 3 :(得分:0)
考虑导航链接的这种结构:
$links = [
'primary_navigation' => [
'children' => [
[
'label' => 'link'
],
[
'label' => 'link',
'children' => [
['label' => 'sublink'],
['label' => 'sublink'],
],
],
],
],
'secondary_navigation' => [
'children' => [
[
'label' => 'link'
],
[
'label' => 'link',
'children' => [
[
'label' => 'sublink'
],
[
'label' => 'sublink',
'children' => [/** ... **/],
],
],
],
],
],
];
通过这种方式,你总能了解你的孩子,以及如何递归地找到它们。