Цикл через JSON с PHP, чтобы получить детей

Я все утро пытался сделать что-то, что могло бы показаться чем-то довольно простым, и я с треском провалился.

У меня есть запрос API, который возвращает действительные данные JSON, и мне нужно пройтись по различным значениям в PHP, чтобы получить несколько узлов в моем приложении.

Вот фрагмент JSON

{
"results": [
{
"date": "2015-06-01",
"rates": [
{
"id": 1592,
"name": "Weekend promotion",
"room_rates": [
{
"room_type_id": 66,
"room_type_code": "DLK",
"sold": 0,
"sell_limit": null,
"availability": 25,
"out_of_order": 0,
"single": 85,
"double": 85,
"extra_adult": null,
"child": null
},
{
"room_type_id": 90,
"room_type_code": "DLT",
"sold": 0,
"sell_limit": null,
"availability": 11,
"out_of_order": 0,
"single": 85,
"double": 85,
"extra_adult": null,
"child": null
},

И это то, что я пытаюсь сделать, но я продолжаю получать следующую ошибку (отредактировано для обновления ответа cURL):

Notice: Trying to get property of non-object in /vagrant/web/web/bookingStep2.php on line 135

Warning: Invalid argument supplied for foreach() in /vagrant/web/web/bookingStep2.php on line 135

Notice: Trying to get property of non-object in /vagrant/web/web/bookingStep2.php on line 135

Warning: Invalid argument supplied for foreach() in /vagrant/web/web/bookingStep2.php on line 135

Есть идеи, что я делаю не так? Строка 135 это:

foreach ($ responseData как $ mydata)

$url = 'https://myapi.com/availability?token=xx&from_date='.$from_date.'&to_date='.$to_date;

$options = array(
CURLOPT_RETURNTRANSFER => true,   // return web page
CURLOPT_HEADER         => false,  // don't return headers
CURLOPT_FOLLOWLOCATION => true,   // follow redirects
CURLOPT_MAXREDIRS      => 10,     // stop after 10 redirects
CURLOPT_ENCODING       => "",     // handle compressed
CURLOPT_USERAGENT      => "test", // name of client
CURLOPT_AUTOREFERER    => true,   // set referrer on redirect
CURLOPT_CONNECTTIMEOUT => 120,    // time-out on connect
CURLOPT_TIMEOUT        => 120,    // time-out on response
);
$ch = curl_init($url);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);

curl_close($ch);


// Decode the response
$responseData = json_decode($result, TRUE);

// Put everyting to the screen with var_dump;
var_dump($responseData);

// With print_r ( useful for arrays );
//print_r($responseData);

// List just review ratings with foreach;
foreach($responseData as $mydata)
{
foreach($mydata->results as $values) {
echo $values->rates . "\n";
}

}

Мне нужно иметь возможность вернуть следующие узлы ….

results>rates>name
results>rates>room_rates>room_type_id
results>rates>room_rates>availability

Я полностью застрял!

Var_dump возвращает мой массив, поэтому cURL теперь работает правильно.

Саймон

4

Решение

Похоже, что ваш запрос cURL виноват, вы не говорите cURL, что ожидаете ответа, поэтому cURL просто возвращает логический успех вашего первоначального запроса, и он успешно его отправил.

От PHP curl_exec page.

Возвращает ИСТИНА в случае успеха или ЛОЖЬ в случае неудачи. Однако, если установлена ​​опция CURLOPT_RETURNTRANSFER, она вернет результат в случае успеха, FALSE в случае ошибки.

Это успешно, но вы не говорите, что ожидаете ответа, поэтому он возвращается TRUE,

Попробуй это:

$url = 'https://myapi.com/api?token=xxx&from_date='.$from_date.'&to_date='.$to_date;

$options = array(
CURLOPT_RETURNTRANSFER => true,   // return web page <-- This is the important one that tells cURL you want a response.
CURLOPT_HEADER         => false,  // don't return headers
CURLOPT_FOLLOWLOCATION => true,   // follow redirects
CURLOPT_MAXREDIRS      => 10,     // stop after 10 redirects
CURLOPT_AUTOREFERER    => true,   // set referrer on redirect
CURLOPT_CONNECTTIMEOUT => 120,    // time-out on connect
CURLOPT_TIMEOUT        => 120,    // time-out on response
);
$ch = curl_init($url);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);

curl_close($ch);

2-я ошибка

Теперь у нас есть cURL, работающий, давайте обратимся к результату. Помните, что при преобразовании JSON каждая фигурная скобка ({) будет производить объект, и каждая квадратная скобка ([) создаст массив. Поэтому, если мы будем следовать вашему JSON, мы увидим, что вы получите объект обратно, содержащий свойство results, Вы можете получить доступ к этому с помощью $responseData->results,

В вашем втором foreach вы пытаетесь получить доступ к свойству объекта. Результаты не объект, это массив (посмотрите на ваш JSON, он содержит [так что это массив). Чтобы получить ставки, следуйте через строку JSON, и вы увидите, что вам нужно сделать это:

foreach($responseData->results[0]->rates as $rate) {
echo $rate->id . "\n";
}
1

Другие решения

Других решений пока нет …