我通过执行以下操作来调用API
$widgets = json_decode(APIHelper::getWidgetsForDashboards($accessToken, $dashboards), true);
响应给了我一个非常大的数据。我已经举例说明了其中一个元素的响应是什么样的
2 => array:23 [▼
"title" => ""
"type" => "smartLabel"
"options" => array:5 [▼
"title" => true
"data" => array:1 [▼
0 => array:3 [▼
"labelName" => "Label"
"labelValues" => array:1 [▼
0 => "Some Name"
]
]
]
]
]
所以我面临的工作就是获得labelValues。但是有一些条件。我只想要labelValues用于具有smartLabel类型的对象。现在我有一个工作解决方案,我将展示,我只是觉得有一个更简单的方法来实现这一点,因为我目前的解决方案涉及很多嵌套。这就是我所做的
$titlesArray = array();
foreach($widgets as $widget) {
if ($widget['type'] == 'smartLabel') {
foreach($widget['options'] as $optionKey => $optionValue) {
if($optionKey == 'data') {
foreach($optionValue as $key => $value) {
if($key == 'labelValues') {
foreach($value as $labelKey => $labelValue) {
if($labelKey == 'labelValues') {
foreach($labelValue as $label) {
$titlesArray[] = array(
$label
);
}
}
}
}
}
}
}
}
}
有没有办法可以清理它?
由于
答案 0 :(得分:1)
是的,您可以通过仅使用未知(例如数字)键迭代数组并使用负if子句来减少嵌套:
$titlesArray = array();
foreach($widgets as $widget) {
if ($widget['type'] != 'smartLabel') continue;
foreach($widget['options']['data'] as $dataItem) {
foreach($dataItem['lableValues'] as $value) {
$titleArray[]=$value;
}
}
}
答案 1 :(得分:1)
您可以通过循环$widget['options']['data']
和$value['labelValues']
来摆脱两个级别。
这也将删除两级条件语句。
然后您还可以使用array_merge()
一次性获取所有lableValues。
像(未经测试的......):
foreach($widgets as $widget) {
if ($widget['type'] === 'smartLabel') {
foreach($widget['options']['data'] as $key => $value) {
$titlesArray = array_merge($titlesArray, $value['labelValues']);
}
}
}
答案 2 :(得分:1)
为了考虑使用Laravel collections,您可以转换数组并使用集合提供的漂亮选项。
$titlesArray = collect($widgets)->filter(function ($widget) {
return $widget['type'] === 'smartLabel';
})->pluck('options')
->pluck('data')
->flatten(1)
->pluck('labelValues')
->flatten();