将导航行数组与默认值合并

Posted

技术标签:

【中文标题】将导航行数组与默认值合并【英文标题】:Merging navigation row array with default values 【发布时间】:2016-03-25 20:28:14 【问题描述】:

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

这是一个带有一些默认键的示例父节点。

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

我错过了什么?

【问题讨论】:

什么是 $this->defaults ? 我在粘贴时编辑了一些代码,引用了我上面提到的 $defaults 变量。 您想将 $allRows 转换为 $default 结构正确吗?? 我希望每一行都有默认值。 【参考方案1】:

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

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

public function mergeWithDefaults(&$navRows)

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

【讨论】:

以上是关于将导航行数组与默认值合并的主要内容,如果未能解决你的问题,请参考以下文章

使用 Push segue 时将导航栏改回默认值

数组的相关知识

将数组数组保存为用户默认值

使用 swift 将数组保存和检索到用户默认值

如何合并接口和变量的默认值?

具有默认值的打字稿固定数组