如何在SilverStripe 3模板中按日期分组外部API的JSON数据?
解决SilverStripe中ArrayList按日期分组的问题
嘿,我懂你现在的处境——已经成功把API数据读到ArrayList里了,但卡在按日期分组这一步对吧?其实GroupedList完全可以用来处理ArrayList,只是你需要先把数组元素转成SilverStripe能识别的对象类型,因为GroupedList默认是针对ViewableData子类(比如DataObject、ArrayData)来处理字段的。
先给你改好的代码,一步步拆解来看:
首先,把你原来的纯数组转成ArrayData对象,这样GroupedList就能识别里面的Date字段了:
$myList = ArrayList::create(); foreach ($jsonData['list'] as $result) { // 把纯数组转成ArrayData,让GroupedList可以通过字段名访问数据 $myResult = ArrayData::create($result); $myList->push($myResult); }
接下来用GroupedList包装这个ArrayList,然后调用groupBy方法按Date字段分组:
// 用GroupedList处理ArrayList $groupedList = GroupedList::create($myList); // 按Date字段分组,得到的是按日期为键的ArrayList集合 $groupedData = $groupedList->groupBy('Date');
如果需要转换成你想要的纯数组结构,可以再遍历处理一下:
$newArray = []; foreach ($groupedData as $date => $items) { // 把每个分组里的ArrayData转成纯数组 $newArray[$date] = $items->toArray(); }
这样$newArray就完全是你想要的格式了——每个日期作为键,对应一个包含对应数据的数组。
为什么原来的方法不行呢?因为你之前的ArrayList里是纯PHP数组,GroupedList没办法直接识别数组里的键名作为字段。转成ArrayData之后,它就变成了SilverStripe的可视图对象,GroupedList可以通过getField('Date')来获取日期值,自然就能正确分组了。
内容的提问来源于stack exchange,提问作者CodeLearner20
相关产品推荐
相关产品推荐

