Как мне выполнить цикл через многомерный массив JSON в PHP?

#php #json #parsing

#php #json #синтаксический анализ

Вопрос:

Я хочу написать код для выполнения цикла через многомерный массив (глубиной 4 или 5) и повторить все найденные ключи и значения и пропустить пустые массивы.

 $drugs = fopen("http://dgidb.org/api/v2/interactions.json?drugs=FICLATUZUMAB", "r");
$json_drugs = stream_get_contents($drugs);
fclose($drugs);
$data_drugs = json_decode($json_drugs,true);

foreach ($data_drugs as $key => $value) 
...
  

Кто-нибудь, кто угодно, Феррис?

Комментарии:

1. Используйте рекурсивную функцию.

2. Повторить все внутри массива? Хорошо… print_r($data_drugs); попробуйте это. Вам не нужно foreach ставить print_r сразу после json_decode

3. print_r ($data_drugs); нет, я хочу коснуться каждого элемента массива — если я могу это сделать, то я могу делать что угодно с содержимым массива, например, добавлять форматирование, логику и т.д.

Ответ №1:

Ваш $data_drugs больше не является json, после того как json_decode является ассоциативным массивом.
Вам не нужен какой-либо цикл для просмотра ключей и значений

 $data_drugs = json_decode($json_drugs,true);
print_r($data_drugs);

/* or if you don't like inline */

echo'<pre>';
print_r($data_drugs);
echo'</pre>';
  

Вы можете использовать var_dump($data_drugs) ключи и значения с типами, вероятно, вам это не нужно
Но если вы хотите больше отображать ключи и значения…необычное использование рекурсивной функции

 function show($x){
    foreach($x as $key=>$val){
        echo"<p>$key : ";
        if(is_array($val)){ echo". . ."; show($val);}
        else{ echo"$val</p>";}}}

show($data_drugs);
  

Комментарии:

1. Мне это нравится, очень элегантно. Это то, что называется рекурсивной функцией (как предложено @Barmar выше), т. Е. Она вызывает саму себя?

2. @barnyard моя функция show() не является … ну, это ленивая версия, требуется немного больше, чтобы получить действительно элегантный дисплей 🙂 И да, это рекурсивный самопроизвольный вызов. В php для вызова функции вы должны ввести ее имя (с необходимыми параметрами) — как в последней строке. show() в 4-й строке имеет условие — если обрабатываемое значение является массивом, то вызывается самостоятельно: «сделайте мне для этого конкретного значения», в этом нет ничего особенного, один из методов. И да, правильное использование элегантно

3. Ну, это касается каждого элемента (ключа и значения) без жестко заданных имен индексов (как моя собственная попытка) в короткой повторно используемой функции — я думаю, это элегантно, потому что это так просто, форматирование вывода — это украшение. Спасибо @black blue