PHP-检查多维数组中的子数组

时间:2015-04-28 22:07:46

标签: php

我有一个数组,其中包含在网站上构建导航菜单的数据。

这是它的设置方式:

$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;

想法?

4 个答案:

答案 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>';
}

这是输出:

父项目

label =主页
icon = fa-home
id =
class =
url = /index.php
blank = 0

父项目

label =管理员icon = fa-user
id =
class =
url =#
blank = 0

子项

label =注释
图标=
id =
class = < br /> url = /notes.php
blank = 0

子项目

label =测试
icon =
id =
class =
url = /testing.php
blank = 0

父项

label =资源
icon = fa-thumb- tack
id =
class =
url =#
blank = 0

答案 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' => [/** ... **/],
                    ],
                ],
            ],
        ],
    ],
];

通过这种方式,你总能了解你的孩子,以及如何递归地找到它们。