Php 具有多态关系的多维数组(树结构)

Php 具有多态关系的多维数组(树结构),php,arrays,laravel,recursion,tree,Php,Arrays,Laravel,Recursion,Tree,为了理解我想做什么,这里有一个简单的解释:我想创建模板 一个“模板”有一个“面板” 此“面板”有一些“项目”和另一个“面板” 我们必须一步一步地做,直到最后一个“项目” 我想要这样的东西: - Template - Panel "Section" - Panel "Slider" - Panel "Slide 1" - Item "Text 1" - Item "Text 2"

为了理解我想做什么,这里有一个简单的解释:我想创建模板

一个“模板”有一个“面板” 此“面板”有一些“项目”和另一个“面板” 我们必须一步一步地做,直到最后一个“项目”

我想要这样的东西:

- 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个模型,分别是“面板”、“项目”和“面板内容”(这一个有一些属性n“parent\u id”、“contentable\u id”和“contentable\u type”,用于知道哪个面板是父面板,哪个项目或面板将是内容

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

我所做的 目前,我使用递归函数让Panel的子级逐步构建一个数组,该数组的结构如我在开始时所示

私有函数getChildren(PanelContent$PanelContent,string$parentName,string$key):void
{
$this->result['template']['global_panel'][$parentName][$key]=$panelContent->contentable->toArray();
如果($panelContent->contentable_type==='panel'){
foreach($panelContent->contentable->contents as$key=>$container){
$this->getChildren($container,$container->contentable->name,$key);
}
}
}
我想要什么 我想要像这样的东西,像树结构

$this->result=[
“模板”=>[
'id'=>1,
'name'=>'MySlider'
“内容”=>[
“id”=>745,
“名称”=>“滑块”,
'类型'=>'面板',
“幻灯片”=>[
0 => [
“id”=>500,
“名称”=>“幻灯片”,
'类型'=>'面板'
“按钮”=>[
0 => [
“id”=>877,
“名称”=>“按钮”,
'类型'=>'项目'
]
]
],
1 => [
“id”=>500,
“名称”=>“幻灯片”,
'类型'=>'面板'
“按钮”=>[
0 => [
“id”=>877,
“名称”=>“按钮”,
'类型'=>'项目'
]
]
]
]
]
]
];
我现在有什么 目前,我有这样的想法:

- 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"
$this->result=[
“模板”=>[
'id'=>1,
'name'=>'MySlider'
“内容”=>[
“id”=>745,
“名称”=>“滑块”,
'类型'=>'面板'
],
“幻灯片”=>[
0 => [
“id”=>500,
“名称”=>“幻灯片”,
'类型'=>'面板'
],
1 => [
“id”=>500,
“名称”=>“幻灯片”,
'类型'=>'面板'
]
],
“按钮”=>[
0 => [
“id”=>877,
“名称”=>“按钮”,
'类型'=>'项目'
],
1 => [
“id”=>877,
“名称”=>“按钮”,
'类型'=>'项目'
]
]
]
];
使用此代码,结果为“正常”,因为此行的键错误:

$this->result['template']['global_panel'][$parentName][$key]=$panelContent->contentable->toArray();
但我真的不知道如何处理我的数据。 我希望我的解释是好的。你对此有什么想法吗?我怎样才能正确地构建我的数组(当然是json)


谢谢您,祝您愉快!

我找到了一个解决方案。Laravel有很多助手,其中一个是array

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”函数,我可以使用string为数组创建动态路径。 例如:

"template.data.slider.slide.0.test"
将是:

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

谢谢你的帮助。

为什么“我现在拥有的”中没有“全球面板”"当它作为一个键出现在你的代码中时,它是什么部分?这是一个很好的问题,顺便说一句!谢谢你的回答!在第一次调用我的函数之前,我已经开始用一个模板和他的面板构建我的数组,这一个被称为“全局面板”。我以前这么做过,因为我知道总是只有一个模板和一个“全局面板”。所以我解决了这个问题按钮不在他们的幻灯片中。对吗?没错。我所有的面板/项目子项都不在他们的幻灯片中。我只是用按钮显示,但我对每个子项都有相同的问题,就像我是拉威尔的一个noob,但如果一切都失败,你可以迭代幻灯片并用相同的键将按钮移动到幻灯片中。如果你我们想要这个非传统的解决方案,那么请让我知道。