Запись ветвления xml в массив

114
25 декабря 2020, 14:40

Есть в XML ветвления, например: "genre" и "country", у которых "дети" с названием "name". В рамках учебного курса хочу записать все жанры фильма в один массив, чтоб в дальнейшем преобразовать его в строку функцией implode и записать в базу данных.

Перепробывал много вариантов, один из них:

$filmTitle = null;
$filmTitleOriginal = null;
$filmYear = null;
$filmCountry[] = null;
$filmGenre[] = null;
$filmPoster = null;
foreach ($xml as $movieKey => $movie) {
    $filmTitle = $movie->title_russian;
    $filmTitleOriginal = $movie->title_original;
    $filmYear = $movie->year;
    foreach ($movie->country->children() as $countryKey => $country) {
        $filmCountry[] = $country;
    }
    foreach ($movie->genre->children() as $genreKey => $genre) {
        $filmGenre[] = $genre;
    }
    foreach ($movie->poster->big->attributes() as $posterKey => $poster) {
        $filmPoster = $poster;
    }
    echo $filmTitle . '<br>'
    . $filmTitleOriginal . '<br>'
    . $filmYear . '<br>'
    . implode(', ', $filmCountry) . '<br>'
    . implode(', ', $filmGenre) . '<br>'
    . $filmPoster . '<br>';
}

Файл XML:

<?xml version="1.0"?>
<response>
  <movie>
    <id>154054</id>
    <type>movie</type>
    <title_russian>Джой</title_russian>
    <title_original>Joy</title_original>
    <year>2015</year>
    <runtime>0</runtime>
    <poster>
      <small url="http://c.cinemate.cc/media/m/4/5/154054/0.small.jpg"/>
      <medium url="http://c.cinemate.cc/media/m/4/5/154054/0.medium.jpg"/>
      <big url="http://c.cinemate.cc/media/m/4/5/154054/0.big.jpg"/>
    </poster>
    <url>http://cinemate.cc/movie/154054/</url>
    <country>
      <name>США</name>
    </country>
    <genre>
      <name>биография</name>
      <name>драма</name>
      <name>комедия</name>
    </genre>
  </movie>
  <movie>
    <id>159513</id>
    <type>movie</type>
    <title_russian>Лазурный берег</title_russian>
    <title_original>By the Sea</title_original>
    <year>2015</year>
    <runtime>0</runtime>
    <poster>
      <small url="http://c.cinemate.cc/media/m/3/1/159513/0.small.jpg"/>
      <medium url="http://c.cinemate.cc/media/m/3/1/159513/0.medium.jpg"/>
      <big url="http://c.cinemate.cc/media/m/3/1/159513/0.big.jpg"/>
    </poster>
    <url>http://cinemate.cc/movie/159513/</url>
    <country>
      <name>США</name>
    </country>
    <genre>
      <name>драма</name>
      <name>мелодрама</name>
    </genre>
  </movie>
</response>

Как можно решить данный вопрос?

Answer 1

Во-первых, вы объявляете пустой массив не верно, присваивая элементу с индексом 0 значение null. Должно быть так:

$filmCountry = [];

Во-вторых, обнулять переменные нужно в пределах итерации.

В-третьих, при взятии атрибута, его необходимо явно указывать: url.

$response = simplexml_load_file('movie.xml');
foreach ($response as $movie) {
  $countries = [];
  $genres = [];
  foreach ($movie->country->children() as $country) {
    $countries[] = $country;
  }
  foreach ($movie->genre->children() as $genre) {
    $genres[] = $genre;
  }
  echo '<pre>',
    $movie->title_russian . '<br>',
    $movie->title_original . '<br>',
    $movie->year . '<br>',
    implode(', ', $countries) . '<br>',
    implode(', ', $genres) . '<br>',
    $movie->poster->big->attributes()->url,
    '</pre>';
}
READ ALSO
Обращение к базе данных MySQL

Обращение к базе данных MySQL

Собственно вопрос в том , как сделать обращение в баззу данных при помощи браузераЯ знаю ,что это делается при помощи php (запросы в MySQL) и javascript(делаем...

126
Связать react js и php. Возможно?

Связать react js и php. Возможно?

Начал изучать react js, node jsТакая мысль пришла

137
MySQLi должно возвращает одно значение

MySQLi должно возвращает одно значение

В классе реализую метод который должен возвращать одно значениеМеня похоже заклинило нужна подсказка

118
Опросник древо PHP

Опросник древо PHP

Вообщем ребят нужен ваш совет или же помощь, есть алгоритм из другой областиНужно на его основе создать (???) Я признаться даже не знаю как это...

101