Я использую multi curl, чтобы загрузить несколько URL-адресов и проанализировать их с помощью цикла foreach. Вот структура этих ответов (print_r результат):Как json_decode несколько массивов вместе?
Array(
[0] => {
"Animals": [{
"Number": 1,
"AnimalName": Lion
}],
"Continents": [{
"ContinentName": Africa
}]
}
[1] => {
"Animals": [{
"Number": 1,
"AnimalName": Tiger
}],
"Continents": [{
"ContinentName": Africa
}]
}
[2] => {
"Animals": [{
"Number": 1,
"AnimalName": Leopard
}],
"Continents": [{
"ContinentName": Africa
}]
}
)
Учитывая, что все ответы имеют одинаковые или почти такую же структуру, я хотел бы, чтобы обработать их все вместе. Или, еще лучше, выберите, какие из них будут обрабатываться вместе (примером может быть группировка массивов 1-2 и 3-5 вместе).
В этом случае мне нужно изменить некоторые слова с помощью str_replace (это хорошо работает с этим кодом), затем json_decode и проанализировать все, используя цикл foreach. К сожалению, похоже, что json_decode не работает таким образом, и я не получаю никаких результатов с циклом foreach. Если я добавлю номер массива в форме json_decode($res[0], true);
, тогда будут отображены результаты. Вот полный код:
<?php
$downloads = array(
"http://www.example.com/1",
"http://www.example.com/2",
"http://www.example.com/3"
);
$mh = curl_multi_init();
foreach ($downloads as $i => $download) {
$connection[$i]=curl_init($download);
curl_setopt($connection[$i], CURLOPT_HTTPHEADER, array('Accept: application/json'));
curl_setopt($connection[$i], CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($connection[$i], CURLOPT_RETURNTRANSFER,true);
curl_multi_add_handle ($mh,$connection[$i]);
}
do {
$n=curl_multi_exec($mh,$active);
curl_multi_select($mh, 0.7);
} while ($active);
foreach ($downloads as $i => $download) {
$res[$i]=curl_multi_getcontent($connection[$i]);
curl_multi_remove_handle($mh,$connection[$i]);
curl_close($connection[$i]);
}
curl_multi_close($mh);
$old = array('Cat', 'Lion');
$new = array('Dog', 'Tiger');
$resultsall = str_replace($old, $new, $res);
$resultsall = (array) json_decode($res, true); // How to make this work?
// These work:
$results1 = json_decode($res[0], true);
$results2 = json_decode($res[1], true);
$results3 = json_decode($res[2], true);
// This doesn't output anything:
foreach($resultsall['Animals'] as $val1)
{ echo $val1['AnimalName']; }
// This works well:
foreach($results1['Animals'] as $val2)
{ echo $val2['AnimalName']; }
?>
Есть ли способ сделать все json_decoding сразу? Я чувствую, что это очень простое изменение кода, но все изменения, которые я пробовал, не сработали.
Благодарим вас за предложение. Поэтому в моем случае это должно быть '$ resultsall = array_map (function ($ json) {return json_decode ($ json, true);}, $ res [0], $ res [1]);'? Я пробовал это, но ничего не получал. Я также пробовал использовать только '$ res [0]' или '$ res', но выхода нет. – Val55
№ Код, как показано, должен работать. Я ничего не говорил о '$ res [0]'. – deceze
Если я делаю 'print_r ($ resultsall);', он отображает новый код. Но цикл foreach по-прежнему не работает с ним. Как мне его настроить? – Val55