Извлечение json-данных с помощью curl

Я пытался извлечь данные из json в следующем формате:

[{"_type":"pipe","time":"2013-10-25 02:42:51","1_price":["00.00"],"1_name":["name"],"_template":"675fgy","1_purl":["http://"],"_cached_page_id":"te487","1_image":["image.jpeg"],"url":"http://"},
[{"_type":"pipe","time":"2013-10-25 02:42:55","1_price":["00.00"],"1_name":["name"],"_template":"16778f","1_purl":["http://"],"_cached_page_id":"456gt","1_image":["image.jpeg"],"url":"http://"},

мой следующий код возвращает "Array2013-10-25 02:42:51", т.е. он возвращает только значение "time" can not, чтобы получить значение "1_name",

скажите, пожалуйста, что я делаю неправильно

$url = "http://.../api.output";

 $ch = curl_init();

 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

 curl_setopt($ch, CURLOPT_URL,$url);

 $result=curl_exec($ch);

 $arr = json_decode($result, true);

 foreach($arr as $val)
 {
 echo $val['1_name'];
 echo $val['time'];
 }
2 ответа

Если вы print_r результат json_decode, вы увидите что-то вроде этого:

Array
(
 [0] => Array
 (
 [_type] => pipe
 [time] => 2013-10-25 02:42:51
 [1_price] => Array
 (
 [0] => 00.00
 )

 [1_name] => Array
 (
 [0] => name
 )

 [_template] => 675fgy
 [1_purl] => Array
 (
 [0] => http://
 )

 [_cached_page_id] => te487
 [1_image] => Array
 (
 [0] => image.jpeg
 )

 [url] => http://
 )

 [1] => Array
 (
 [_type] => pipe
 [time] => 2013-10-25 02:42:55
 [1_price] => Array
 (
 [0] => 00.00
 )

 [1_name] => Array
 (
 [0] => name
 )

 [_template] => 16778f
 [1_purl] => Array
 (
 [0] => http://
 )

 [_cached_page_id] => 456gt
 [1_image] => Array
 (
 [0] => image.jpeg
 )

 [url] => http://
 )

)

Итак, у вас есть Array в $arr, что делает это хорошим именем переменной.

Первый элемент $arr имеет ключ 0 (что означает значение [0] =>) и также является массивом, но ассоциативным (он имеет строки как ключи вместо цифр). Первый ключ - это _type, второй - time и т.д.

Если вы посмотрите на значение ключа 1_name, вы увидите, что это еще один уровень Array. Он имеет единственную запись с цифровым ключом. Если вы хотите это значение, вам нужно будет индексировать его. Полный путь равен $arr[0]['1_name'][0].

Но вам не нужно просто $arr[0], вы хотите, чтобы все элементы $arr, поэтому вы перебираете их. Это прекрасно, это просто означает, что $val заменяет $arr[whatever], поэтому у вас есть $val['1_name'][0]. То же самое касается 1_price, 1_purl и т.д. Но не для _type или time или других ключей, которые не показывают массивы.


Измените свой цикл for следующим образом:

$i=0;
foreach($arr as $k=>$v)
 {
 echo $arr['1_name'][$i];
 echo $arr['time'];
 $i++;
 }

licensed under cc by-sa 3.0 with attribution.