我正在尝试为我的网站导航行创建一个节点树。
以下是包含一些默认密钥的示例父节点。
$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
]
我错过了什么?
答案 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']);
}
}
}