【问题标题】:Silverstripe 3 - Converting a PHP multidim array to something a template can loopSilverstripe 3 - 将 PHP multidim 数组转换为模板可以循环的东西
【发布时间】:2018-09-29 07:49:57
【问题描述】:

为此尝试了 ArrayList 和 ArrayData 的各种组合,但没有成功。谷歌只向我展示了正在转换的非常简单的数组。点赞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);
}

我这里有什么问题?

【问题讨论】:

  • docs.silverstripe.org/en/4/developer_guides/model/lists 我还会检查locations.length 和venue.length,就好像组数组为空一样,它仍然可能导致true。我会看一下,看看我能不能尽快回答这个问题。
  • 让我直截了当地说,您拥有数组(简化数组)并将其转换为模板的 ArrayList。对吗?
  • @DanielTate 是的。在了解了 ArrayData 和 ArrayList 之后,我刚刚找到了解决方案。请参阅下面的答案。

标签: php silverstripe


【解决方案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;

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 2013-11-22
    • 2022-01-21
    • 1970-01-01
    • 2019-01-02
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多