Silverstripe 3 - 将PHP multidim数组转换为模板可循环的内容

时间:2018-04-18 23:17:45

标签: php silverstripe

为此尝试了ArrayList和ArrayData的各种组合,但没有运气。 Google只向我展示了非常简单的转换数组。像this

一样

这是我的简化数组:

$locations = [
    'Venue' => [
        [
            'Name' => 'ANZ Events Centre',
        ]
    ],
    'Hotels' => [
        [
           'Name' => 'Pullman Hotel',
        ],
        [
           'Name' => 'Mercure Hotel',
        ]
    ]
]

这就是我想在模板中做的事情:

<% if $Locations %>
    <% if $Locations.Venue %>
        <% loop $Locations.Venue %>
            $Name
        <% end_loop %>
    <% end_if %>
<% end_if %>

我无法理解ArrayList的作用,因为它为我添加的每条记录添加了一个数字键。但这是我尝试将其转换为模板可以循环的内容的最后一个化身:

$templateArrayList = ArrayList::create();
foreach($locations as $type => $group) {
    $groupArray = [];
    foreach($group as $location) {
        $groupArray[$type][] = ArrayData::create($location);
    }
    $groupArrayData = ArrayData::create($groupArray);
    $templateArrayList->push($groupArrayData);
}

我在这里遇到了什么问题?

1 个答案:

答案 0 :(得分:1)

找到了摆弄ArrayList和ArrayData的各种组合的答案,并留待将来搜索。

在我看来,最简单的方法是关联数组(例如Venue / Hotel组键和数据元素中的Name键)是ArrayData。非关联数组(例如两个酒店数组的集合)是ArrayList。

考虑到这一点,这是我的工作代码:

foreach($locations as $type => $group) {
    $groupArray[$type] = ArrayList::create();
    foreach($group as $location) {
        $groupArray[$type]->push(ArrayData::create($location));
    }
    $groupArrayData = ArrayData::create($groupArray);
}

$data = [
    'Locations' => $groupArrayData
];

return $data;