2015-09-25 4 views
-1

Я использую 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 сразу? Я чувствую, что это очень простое изменение кода, но все изменения, которые я пробовал, не сработали.

ответ

0

json_decode ожидает a строка как входной сигнал. Если вы даете ему массив, он не знает, что с этим делать. Вам просто нужно выполнить цикл и вызвать json_decode для каждой строки в вашем массиве индивидуально. Сокращенная оболочка для такого рода операции является карта массива:

$resultsall = array_map('json_decode', $res); 

Хотя, если вы хотите передать дополнительные аргументы, то нужно быть:

$resultsall = array_map(function ($json) { return json_decode($json, true); }, $res); 
+0

Благодарим вас за предложение. Поэтому в моем случае это должно быть '$ resultsall = array_map (function ($ json) {return json_decode ($ json, true);}, $ res [0], $ res [1]);'? Я пробовал это, но ничего не получал. Я также пробовал использовать только '$ res [0]' или '$ res', но выхода нет. – Val55

+0

№ Код, как показано, должен работать. Я ничего не говорил о '$ res [0]'. – deceze

+0

Если я делаю 'print_r ($ resultsall);', он отображает новый код. Но цикл foreach по-прежнему не работает с ним. Как мне его настроить? – Val55

0

Когда вы используете $mergedArray = array_merge($firstArray, $secondArray), два массива объединены в один и доступны через $mergedArray. Обратите внимание, что array_keys будут перенумерованы.

+0

Пробовал, но нет выходного : '$ mergeresults = array_merge ($ res [0], $ res [1], $ res [2]); $ resultsall = json_decode ($ mergeresults, true); ' – Val55

Смежные вопросы