Использование PHP ‘s foreach для создания массива значений из данных JSON

#php #json #foreach

#php #json #foreach

Вопрос:

Я впервые работаю с данными JSON, и у меня есть некоторый PHP для получения некоторых данных JSON, как показано ниже (за исключением того, что в теле находятся сотни measuregrps).

 $json = file_get_contents("http://wbsapi.withings.net/measure?action=getmeasures");
$json_o = json_decode($json);
  

Как мне использовать foreach, скажем, для создания одномерного массива значений для type = 1?

     {
        "status": 0,
        "body": {
            "updatetime": 1249409679,
            "measuregrps": [
                {
                    "grpid": 2909,
                    "attrib": 0,
                    "date": 1222930968,
                    "category": 1,
                    "measures": [
                        {
                            "value": 79300,
                            "type": 1,
                            "unit": -3
                        },
                        {
                            "value": 652,
                            "type": 5,
                            "unit": -1
                        },
                        {
                            "value": 178,
                            "type": 6,
                            "unit": -1
                        },
                        {
                            "value": 14125,
                            "type": 8,
                            "unit": -3
                        }
                    ]
                },
                {
                    "grpid": 2908,
                    "attrib": 0,
                    "date": 1222930968,
                    "category": 1,
                    "measures": [
                        {
                            "value": 78010,
                            "type": 1,
                            "unit": -3
                        }
                    ]
                },
                {
                    "grpid": 2907,
                    "attrib": 0,
                    "date": 1222930968,
                    "category": 1,
                    "measures": [
                        {
                            "value": 77300,
                            "type": 1,
                            "unit": -3
                        },
                        {
                            "value": 678,
                            "type": 5,
                            "unit": -1
                        }

                    ]
                },


            ]
        }
    }
  

Комментарии:

1. Иногда человеку, спрашивающему, цель понятнее, чем тому, кто читает. Каким именно должен быть результат? array(/* ... */) нотация была бы особенно полезна.

Ответ №1:

 $json_o = json_decode($json,true);

$result = array();

foreach ($json_o['body']['measuregrps'] as $measuregrp)
 foreach ($measuregrp['measures'] as $measure)
  if ($measure['type'] == 1)
   $result []= $measure['value'];
  

Комментарии:

1. Но в следующий раз, пожалуйста, попробуйте придумать какой-нибудь код самостоятельно, тогда мы сможем помочь, если это не сработает.

2. На самом деле это не сработает, поскольку body etc. являются экземплярами stdClass. Они не являются массивами, поэтому их нельзя вызвать как массивы.

3. Это действительно работает, поскольку второй параметр говорит, что в результате должны использоваться ассоциативные массивы вместо стандартных объектов. php.net/manual/en/function.json-decode.php

4. Я ненавижу отвратительные смеси объектов и массивов в PHP, поэтому я всегда вызываю JSON decode подобным образом.

Ответ №2:

Что-то вроде

 $values = array();

foreach($json_o->body->measuregrps as $group){
  foreach($group->measures as $measure){
    if($measure->type == 1){
      $values[] = $measure->value;
    }
  }
}

print_r($values);
  

подойдет