массив php: цикл через многомерный массив из api

#php #arrays #multidimensional-array

#php #массивы #многомерный массив

Вопрос:

Я хочу выполнить цикл через многомерный массив. Я делал это несколько раз раньше, но этот вызов API сводит меня с ума. Может быть, мне следует прекратить кодирование через 10 часов. :/

Моя цель — извлечь сертификат возраста в США, где note =»» из этого вызова. Вызывается переменная $movie

 $url = "https://api.themoviedb.org/3/movie/" . $movieID . "?api_key=" . $apiKey . "amp;" . $language . "amp;" . $sortBy . "amp;append_to_response=release_dates"; // path to your JSON file
$data = file_get_contents($url); // put the contents of the file into a variable
$movie = json_decode($data); // decode the JSON feed
  

foreach:

 foreach ($movie->release_dates as $result) {
    echo $result->release_dates;
}
  

обеспечивает:

 array(31) {
  [0]=>
  object(stdClass)#12 (2) {
    ["iso_3166_1"]=>
    string(2) "FR"
    ["release_dates"]=>
    array(1) {
      [0]=>
      object(stdClass)#13 (5) {
        ["certification"]=>
        string(1) "U"
        ["iso_639_1"]=>
        string(0) ""
        ["note"]=>
        string(0) ""
        ["release_date"]=>
        string(24) "2018-02-07T00:00:00.000Z"
        ["type"]=>
        int(3)
      }
    }
  }
  [1]=>
  object(stdClass)#14 (2) {
    ["iso_3166_1"]=>
    string(2) "US"
    ["release_dates"]=>
    array(2) {
      [0]=>
      object(stdClass)#15 (5) {
        ["certification"]=>
        string(5) "PG-13"
        ["iso_639_1"]=>
        string(0) ""
        ["note"]=>
        string(0) ""
        ["release_date"]=>
        string(24) "2018-01-26T00:00:00.000Z"
        ["type"]=>
        int(3)
      }
      [1]=>
      object(stdClass)#16 (5) {
        ["certification"]=>
        string(5) "PG-13"
        ["iso_639_1"]=>
        string(0) ""
        ["note"]=>
        string(0) ""
        ["release_date"]=>
        string(24) "2018-04-24T00:00:00.000Z"
        ["type"]=>
        int(5)
      }
    }
  }
  [2]=>
  object(stdClass)#17 (2) {
    ["iso_3166_1"]=>
    string(2) "CA"
    ["release_dates"]=>
    array(1) {
      [0]=>
      object(stdClass)#18 (5) {
        ["certification"]=>
        string(2) "PG"
        ["iso_639_1"]=>
        string(0) ""
        ["note"]=>
        string(0) ""
        ["release_date"]=>
        string(24) "2018-01-26T00:00:00.000Z"
        ["type"]=>
        int(3)
      }
    }
  }
  [3]=>
  object(stdClass)#19 (2) {
    ["iso_3166_1"]=>
    string(2) "LT"
    ["release_dates"]=>
    array(1) {
      [0]=>
      object(stdClass)#20 (5) {
        ["certification"]=>
        string(4) "N-13"
        ["iso_639_1"]=>
        string(0) ""
        ["note"]=>
        string(0) ""
        ["release_date"]=>
        string(24) "2018-01-26T00:00:00.000Z"
        ["type"]=>
        int(3)
      }
    }
  }
}
  

Я не знаю, как поступить. В этом случае это должен быть R-рейтинг.

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

1. Поделитесь некоторым кодом о том, как вы пытаетесь это сделать

Ответ №1:

Попробуйте что-то подобное:

 $data = '
[
    {
        "iso" : "FR",
        "dates" : [
            {
                "note": "",
                "date": "06.09.2020"
            }
        ]
    },
    {
        "iso" : "US",
        "dates" : [
            {
                "note": "",
                "date": "06.09.2020"
            },
            {
                "note": "",
                "date": "07.09.2020"
            },
            {
                "note": "not empty",
                "date": "08.09.2020"
            }
        ]
    },
    {
        "iso" : "US",
        "dates" : [
            {
                "note": "not empty",
                "date": "09.09.2020"
            },
            {
                "note": "",
                "date": "10.09.2020"
            },
            {
                "note": "not empty",
                "date": "11.09.2020"
            }
        ]
    }
]';

// use json_decode with true to get a associative array.
$movies = json_decode($data, true);
$dates  = array();

foreach ($movies as $movie) {
    
    if ($movie['iso'] === 'US' amp;amp; isset($movie['dates']) amp;amp; is_array($movie['dates'])) {
        
        foreach ($movie['dates'] as $date) {
            
            if (isset($date['note']) amp;amp; empty($date['note']) amp;amp; isset($date['date']) amp;amp; $date['date']) {
                
                $dates[] = $date['date'];
            }
        }
    }
}

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

И в качестве ответа:

 Array
(
    [0] => 06.09.2020
    [1] => 07.09.2020
    [2] => 10.09.2020
)
  

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

1. Спасибо. но это не работает. похоже, проблема в сочетании массивов и объектов.

2. все еще не работает. var_dump($result); равно нулю. насколько я могу видеть, предоставленный код выглядит великолепно. Я не знаю, почему это не работает.

3. Если это то, что вы получаете после синтаксического анализа json (имеется в виду ваш пример), это должно сработать, проверьте, используете ли вы правильные имена ключей для получения вложенных массивов и значений, которые вам нужны.