Любой, кто знает 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; }