【问题标题】:Multidimensional array with polymorphic relation (tree structure)具有多态关系的多维数组(树结构)
【发布时间】:2019-11-15 09:20:22
【问题描述】:

为了了解我想要做什么,这里简单解释一下:我想创建模板。

一个“模板”有一个“面板” 这个“面板”有一些“项目”和另一个“面板” 我们要一步一步做,直到最后一个“Item”

我想要这样的东西:

- Template
    - Panel "Section"
        - Panel "Slider"
            - Panel "Slide 1"
                - Item "Text 1"
                - Item "Text 2"
                - Item "Button"
            - Panel "Slide 2"
                - Panel "Buttons"
                    - Item "Button 1"
                    - Item "Button 2"
                - Item "Text"

借助 Laravel 的多态关系,我有 3 个模型,它们是“Panel”、“Item”和“PanelContent”(这个模型有一些属性“parent_id”、“contentable_id”和“contentable_type”,有助于了解哪个 Panel 是parent,以及哪个 Item 或 Panel 将是内容。

显然,我的模型包含一些对获取内容和父级有用的函数。

我做了什么

目前,我使用递归函数让Panel的孩子逐步构建一个具有我在开头显示的结构的数组。

private function getChildren(PanelContent $panelContent, string $parentName, string $key): void
{
    $this->result['template']['global_panel'][$parentName][$key] = $panelContent->contentable->toArray();
    if ($panelContent->contentable_type === 'panel') {
        foreach($panelContent->contentable->contents as $key => $container) {
            $this->getChildren($container, $container->contentable->name, $key);
        }
    }
}

我想要什么

我想要这样的东西,比如树状结构。

$this->result = [
    'template' => [
        'id' => 1,
        'name' => 'MySlider'
        'contents' => [
            'id' => 745,
            'name' => 'slider',
            'type' => 'panel',
            'slides' => [
                0 => [
                    'id' => 500,
                    'name' => 'slide',
                    'type' => 'panel'
                    'buttons' => [
                        0 => [
                            'id' => 877,
                            'name' => 'button',
                            'type' => 'item'
                        ]
                    ]
                ],
                1 => [
                    'id' => 500,
                    'name' => 'slide',
                    'type' => 'panel'
                    'buttons' => [
                        0 => [
                            'id' => 877,
                            'name' => 'button',
                            'type' => 'item'
                        ]
                    ]
                ]
            ]
        ]
    ]
];

我目前拥有的东西

目前,我有这样的事情:

$this->result = [
    'template' => [
        'id' => 1,
        'name' => 'MySlider'
        'contents' => [
            'id' => 745,
            'name' => 'slider',
            'type' => 'panel'
        ],
        'slides' => [
            0 => [
                'id' => 500,
                'name' => 'slide',
                'type' => 'panel'
            ],
            1 => [
                'id' => 500,
                'name' => 'slide',
                'type' => 'panel'
            ]
        ],
        'buttons' => [
            0 => [
                'id' => 877,
                'name' => 'button',
                'type' => 'item'
            ],
            1 => [
                'id' => 877,
                'name' => 'button',
                'type' => 'item'
            ]
        ]
    ]
];

使用这段代码,结果是“正常的”,因为这一行的键是错误的:

$this->result['template']['global_panel'][$parentName][$key] = $panelContent->contentable->toArray();

但我真的不知道如何处理我的数据。 我希望我的解释是好的。你对此有什么想法吗?如何正确构建我的数组(当然是 json)?

谢谢你,祝你有美好的一天!

【问题讨论】:

  • 为什么'global_panel' 在您的代码中作为键出现在“我目前拥有的东西”部分?好问题,顺便说一句!
  • 感谢您的回复!在第一次调用我的函数之前,我已经开始使用模板和他的面板构建我的数组,这个名为“global_panel”。我以前这样做是因为我知道总是只有一个模板和一个“global_panel”。
  • 所以问题是按钮不在幻灯片内。这是正确的吗?
  • 没错。我所有的 Panel/Item 子项都不在他们的幻灯片中。我只是用按钮显示,但每个孩子都有同样的问题,比如this
  • 我是 Laravel 的菜鸟,但如果一切都失败了,你可以迭代幻灯片并将具有相同键的按钮移动到幻灯片中。如果您想要这种非传统的解决方案,请告诉我。

标签: php arrays laravel recursion tree


【解决方案1】:

我找到了解决方案。 Laravel 有很多助手,其中有一个用于数组。

private function formatTemplateData(PanelContent $panelContent, string $path): void
{
    Arr::set(
        $this->result, 
        'template.data.' . $path, 
        "Je suis une data"
    );

    if ($panelContent->contentable_type === 'panel') {
        foreach($panelContent->contentable->contents as $container) {
            $newPath = $path . '.' . $container->contentable->name . $container->contentable->order;
            $this->formatTemplateData($container, $newPath);
        }
    }
}

通过“set”函数,我可以使用字符串为我的数组创建动态路径。 例如:

"template.data.slider.slide.0.test"

将是:

$array['template']['data']['slider']['slide'][0]['test']

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    相关资源
    最近更新 更多