Как использовать foreach с PHP и XML (simplexml)

Любой, кто знает PHP и XML там? Тогда, пожалуйста, смотрите!

Это мой PHP-код:

<? $xml = simplexml_load_file("movies.xml"); foreach ($xml->movie as $movie){ ?> <h2><? echo $movie->title ?></h2> <p>Year: <? echo $movie->year ?></p> <p>Categori: <? echo $movie->regions->region->categories->categorie ?></p> <p>Country: <? echo $movie->countries->country ?></p> <? } ?> 

Это mys XML-файл:

 <?xml version="1.0" encoding="UTF-8"?> <movies> <movie> <title>A movie name</title> <year>2010</year> <regions> <region> <categories> <categorie id="3">Animation</categorie> <categorie id="5">Comedy</categorie> <categorie id="9">Family</categorie> </categories> <countries> <country id="123">USA</country> </countries> </region> </regions> </movie> <movie> <title>Little Fockers</title> <year>2010</year> <regions> <region> <categories> <categorie id="5">Comedy</categorie> </categories> <countries> <country id="123">USA</country> </countries> </region> </regions> </movie> </movies> 

Результат приведенного выше кода:

 <h2>A movie name</h2> <p>Year: 2010</p> <p>Category: Animation</p> <p>Country: USA</p> <h2>Little Fockers</h2> <p>Year: 2010</p> <p>Category: Comedy</p> <p>Country: USA</p> 

Я хочу, чтобы это было так (см. Категорию в первом фильме):

 <h2>A movie name</h2> <p>Year: 2010</p> <p>Category: Animation, Comedy, Family</p> <p>Country: USA</p> <h2>Little Fockers</h2> <p>Year: 2010</p> <p>Category: Comedy</p> <p>Country: USA</p> 

Примечание. Также мне интересно, как получить запятую между словами, но без запятой на последнем слове …

Попробуй это.

 <?php $xml = simplexml_load_file("movies.xml"); foreach ($xml->movie as $movie) { echo '<h2>' . $movie->title . '</h2>'; echo '<p>' . $movie->year . '</p>'; $categories = $movie->regions->region->categories->categorie; while ($categorie = current($categories)) { echo $categorie; echo next($categories) ? ', ' : null; } echo '<p>' . $movie->countries->country . '</p>'; } ?> 

это то, как вы используете foreach с помощью simplexmlElement:

 $xml = simplexml_load_file("movies.xml"); foreach ($xml->children() as $children) { echo $children->name; } 
 <?php $cat_out=''; foreach($movie->regions->region->categories->categorie as $cat){ $cat_out.= $cat.','; } echo rtrim($cat_out,','); ?> 

Вам нужно также прокручивать элементы categorie , точно так же, как вы перебирали movies .

 echo '<p>'; foreach($movie->regions->region->categories->categorie as $categorie){ echo $categorie . ', '; } echo '</p>'; 

Вы, вероятно, захотите также обрезать трейлинг.


Метод, упомянутый в моем комментарии:

 $categories = $movie->regions->region->categories->categorie; while($category = current($categories)){ echo $category . next($categories) ? ', ' : ''; } 
 <? foreach($movie->regions->region->categories->categorie as $category) { ?> <p>Categori: <?= $category ?></p> <? } ?> 
 function categoryList(SimpleXmlElement $categories){ $cats = array(); foreach($categories as $category){ $cats[] = (string) $category; } return implode(', ', $cats); } 

Затем вы можете называть это из своего цикла следующим образом:

 <? echo categoryList($movie->regions->region->categories); ?> 

Использование массива и implode устраняет необходимость в логике подсчета и обнаружения последней категории.

Выделение его в функции упрощает поддержку и менее запутывает, чем вложение цикла (хотя, по общему признанию, вложенные петли не совпадают).

Попробуй это

 $xml = ... // Xml file data $Json = Xml_to_Json($xml); $array = json_decode($Json,true); echo '<pre>'; print_r($array); foreach ($array as $key => $value) { foreach ($value as $key1 => $value1) { echo '<h2>'.$value1['title'].'</h2> <p>Year: '.$value1['year'].'</p> <p>Category: '; foreach ($value1['regions']['region']['categories']['categorie'] as $categoriekey => $categorie) { echo $categorie.' '; } echo 'Animation</p> <p>Country: '.$value1['regions']['region']['countries']['country'].'</p>'; } } function Xml_to_Json($array){ $xml = simplexml_load_string($array, "SimpleXMLElement", LIBXML_NOCDATA); $json = json_encode($xml); return $json; }