Я все утро пытался сделать что-то, что могло бы показаться чем-то довольно простым, и я с треском провалился.
У меня есть запрос 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 теперь работает правильно.
Саймон
Похоже, что ваш запрос cURL виноват, вы не говорите cURL, что ожидаете ответа, поэтому cURL просто возвращает логический успех вашего первоначального запроса, и он успешно его отправил.
Возвращает ИСТИНА в случае успеха или ЛОЖЬ в случае неудачи. Однако, если установлена опция 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";
}
Других решений пока нет …