Разбор многоуровневого массива JSON и поиск значений ключей на нескольких уровнях

#php #json #parsing

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

Вопрос:

Мне нужна помощь, чтобы найти / распечатать все значения в данном массиве.

Я могу получить все значения на «уровне 1» массива, но не глубже. Каков общий код для разбора многоуровневых массивов. Я полагаю, что если я смогу разобрать api json, то смогу сделать с данными все, что требуется.

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

 <?php
$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);

print_r($data_drugs);        // Dump all data of the Array

foreach ($data_drugs as $key => $value)
    {
    if (empty($value[0]["searchTerm"])) {echo "-<br>";} else {echo "searchTerm  : " . $value[0]["searchTerm"] . "<br>";};
    if (empty($value[0]["searchTerm"])) {echo "-<br>";} else {echo "searchTerm  : " . $value[0]["searchTerm"] . "<br>";};
    if (empty($value[0]["drugName"])) {echo "-<br>";} else {echo "drugName  : " . $value[0]["drugName"] . "<br>";};
    if (empty($value[0]["chemblId"])) {echo "-<br>";} else {echo "chemblId  : " . $value[0]["chemblId"] . "<br>";};
    if (empty($value[0]["interactions"])) {echo "INTERACTIONS : NONE" . "<br>";} else {echo "INTERACTIONS : " . $value[0]["interactions"] . "<br>";};
    if (empty($value[0]["interactions"][0]["interactionId"])) {echo "-<br>";} else {echo ">InteractionId  : " . $value[0]["interactions"][0]["interactionId"] . "<br>";};
    if (empty($value[0]["interactions"][0]["interactionTypes"])) {echo "INTERACTION TYPES : NONE" . "<br>";} else {echo ">Interaction Types : " . $value[0]["interactions"][0]["interactionTypes"] . "<br>";};
    foreach ($data_drugs as $key => $value)
          {
          if (empty($value[0]["interactions"][0]["interactionTypes"][0])) {echo "-";} else {echo ">>interactionTypes : " . $value[0]["interactions"][0]["interactionTypes"][0] . "<br>";};
          }
    if (empty($value[0]["interactions"][0]["geneName"])) {echo "-<br>";} else {echo ">GeneName  : " . $value[0]["interactions"][0]["geneName"] . "<br>";};
    if (empty($value[0]["interactions"][0]["geneLongName"])) {echo "-<br>";} else {echo ">GeneLongName  : " . $value[0]["interactions"][0]["geneLongName"] . "<br>";};
    if (empty($value[0]["interactions"][0]["geneEntrezId"])) {echo "-<br>";} else {echo ">GeneEntrezId  : " . $value[0]["interactions"][0]["geneEntrezId"] . "<br>";};
    if (empty($value[0]["interactions"][0]["sources"])) {echo "SOURCES : NONE" . "<br>";} else {echo ">Sources : " . $value[0]["interactions"][0]["sources"] . "<br>";};
    if (empty($value[0]["interactions"][0]["sources"][0])) {echo "-<br>";} else {echo ">>sources : " . $value[0]["interactions"][0]["sources"][0] . "<br>";};
    if (empty($value[0]["interactions"][0]["pmids"])) {echo ">PMIDs  : NONE" . "<br>";} else {echo ">PMIDs  : " . $value[0]["interactions"][0]["pmids"] . "<br>";};
    if (empty($value[0]["interactions"][0]["pmids"][0])) {echo "-<br>";} else {echo ">>PMIDs  : " . $value[0]["interactions"][0]["pmids"][0] . "<br>";};
    if (empty($value[0]["interactions"][0]["score"])) {echo "-<br>";} else {echo ">Score  : " . $value[0]["interactions"][0]["score"] . "<br>";};
      }
?>
  

Я могу получить все значения на «уровне 1» массива, но не глубже. Каков общий код для разбора многоуровневых массивов. Я полагаю, что если я смогу разобрать api json, то смогу сделать с данными все, что требуется.

Я также получаю предупреждения о преобразовании массива в строку, но я явно называю элемент.

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

1. Вам следует рассмотреть возможность использования рекурсивной функции, которая обходит весь массив.

2. вы пробовали?

3. Нет, я чувствовал, что в вашем ответе недостаточно информации, которую я мог бы применить.

4. Теперь я работаю с 4 циклами ‘for’, циклически перебирающими уровни для получения значений echo, но это долго и требует полной перезаписи для каждого нового типа вызова api. В идеале я хотел бы повторить ключи вместо значений ключей жесткого кодирования и иметь простой алгоритм, который работает с любой структурой массива.

5. Я не помню, чтобы давал вам ответ… и снова, вы, вероятно, ищете рекурсивную функцию ( простой алгоритм ) для обхода вашего массива. Таким образом, у вас есть полная гибкость (т. Е. Не требуется жесткого кодирования) для элегантной обработки массивов разного размера и глубины.