循环通过JSON解码数据

时间:2016-06-22 12:42:41

标签: php arrays json

我通过执行以下操作来调用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
                                    );
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

有没有办法可以清理它?

由于

3 个答案:

答案 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();