Cómo usar foreach con PHP y XML (simplexml)

¿Alguien que conozca PHP y XML? ¡Entonces por favor échale un vistazo!

Este es mi código 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>

<? } ?>

Este es mi archivo 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>

El resultado del código anterior es:

<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>

Quiero que sea así (ver categoría en la primera película):

<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>

Nota: También me pregunto cómo poner la coma entre las palabras, pero sin una coma en la última palabra ...

preguntado el 09 de enero de 11 a las 04:01

7 Respuestas

Prueba con esto.

<?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>';
}
?>

Respondido el 09 de enero de 11 a las 07:01

+1 para eliminar la coma al final. while($categorie = current($movie->...->categorie)) y echo next($movie->...->categorie) ? ', ' : ''; también funciona. - Dan Lugg

así es como se usa foreach con un simplexmlElement:

$xml = simplexml_load_file("movies.xml");
foreach ($xml->children() as $children) {
    echo $children->name;
}

respondido 06 nov., 13:16

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

Respondido el 09 de enero de 11 a las 07:01

Necesita iterar a través del categorie elementos también, de la misma manera que has iterado movies.

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

Probablemente querrá recortar el final , también.


El método mencionado en mi comentario:

$categories = $movie->regions->region->categories->categorie;
while($category = current($categories)){
    echo $category . next($categories) ? ', ' : '';
}

Respondido el 09 de enero de 11 a las 08:01

<? foreach($movie->regions->region->categories->categorie as $category) { ?>
<p>Categori: <?= $category ?></p>
<? } ?>

Respondido el 09 de enero de 11 a las 07:01

function categoryList(SimpleXmlElement $categories){
  $cats = array();
  foreach($categories as $category){
    $cats[] = (string) $category;
  }

  return implode(', ', $cats);

}

Entonces puedes simplemente llamarlo desde tu bucle como:

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

Usando una matriz y implode elimina la necesidad de la lógica de contar y detectar la última categoría.

Aislarlo en una función hace que sea más fácil de mantener y es menos confuso que anidar el bucle (aunque es cierto que los bucles anidados no lo son). que confuso).

Respondido el 09 de enero de 11 a las 07:01

Prueba este

$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;
}

Respondido el 25 de junio de 16 a las 15:06

El json_encode + json_decode es absolutamente innecesario aquí - Gato

esta función devuelve json aquí Xml_to_Json si tu quieres Xml_to_Array luego elimine json_encode + json_decode. - Ajay Kumar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.