将导航行数组与默认值

时间:2015-12-19 04:37:50

标签: php arrays multidimensional-array nodes

我正在尝试为我的网站导航行创建一个节点树。

以下是包含一些默认密钥的示例父节点。

$allRows['inbox'] = [
    "name"  => 'inbox',
    "icon"  => 'inbox',
    "link"  => 'inbox',
    "badge" => [
        'active'    => true,
        'color'     => 'yellow',
        'text'      => '14',
        'position'  => 'right',
    ],
];

这是一个带有一些孩子的父节点的例子。

$allRows['tables'] = [
    "name"  => 'tables.main',
    "icon"  => 'table',
    "index" => [
        [
            'name' => 'tables.normal',
            'link' => 'tables/normal',
        ],
        [
            'name' => 'tables.data-tables',
            'link' => 'tables/data-tables',
            'badge' => [
                'active'    => true,
                'color'     => 'green',
                'text'      => 'v1.10',
                'position'  => 'right',
            ],
        ],
        [
            'name' => 'tables.jquery-grid',
            'link' => 'tables/jquery-grid',
        ],
    ],
];

我希望我的所有节点都适合这种默认结构。

$defaults = [
    "name"       => '',
    "icon"       => '',
    "icon_color" => '',
    "link"       => '#',
    "external"   => false,
    "badge" => [
        'active'    => false,
        'color'     => '',
        'text'      => '',
        'position'  => '',
    ],
    "index"      => [],
];

在我的导航课程中,我$allRows声明如上所述。

我尝试通过传递mergeWithDefaults($allRows)方法作为参考来合并默认值,但无法实现我想要的效果。

public function mergeWithDefaults(&$navRows)
{
    foreach ($navRows as &$navRow) {
        $navRow = array_merge($this->defaults, $navRow);
        if (! $this->isLeaf($navRow)) {
            $navRow = $this->mergeWithDefaults($navRow['index']);
        }
    }
}

private function isLeaf($navRow)
{
    return empty($navRow['index']);
}

为什么我得到的是空值。

array:11 [▼
  "dashboard" => array:7 [▶]
  "inbox" => array:7 [▶]
  "graphs" => null
  "tables" => null
  "forms" => null
  "ui-elements" => null
  "calendar" => array:7 [▶]
  "widgets" => array:7 [▶]
  "app-views" => null
  "gmap-skins" => array:7 [▶]
  "miscellaneous" => null
]

我错过了什么?

1 个答案:

答案 0 :(得分:0)

我终于通过从$navRow =移除$navRow = $this->mergeWithDefaults($navRow['index']);来解决了这个问题。

由于没有返回任何内容,因此我将数据设置为null。

public function mergeWithDefaults(&$navRows)
{
    foreach ($navRows as &$navRow) {
        $navRow = array_merge($this->defaults, $navRow);
        if (! $this->isLeaf($navRow)) {
            $this->mergeWithDefaults($navRow['index']);
        }
    }
}