2011-01-09 12 views
6

¿Alguien que conozca PHP y XML por ahí? ¡Entonces, echa un vistazo!Cómo utilizar foreach con PHP y XML (simplexml)

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 un archivo XML mys:

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

lo quiero para ser 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 obtener la coma entre las palabras, pero sin una coma en la última palabra ...

Respuesta

1

Usted necesita iterar por los elementos categorie también, de la misma manera que He iterado a través de movies.

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

es probable que desee para recortar el , detrás también.


El método mencionado en mi comentario:

$categories = $movie->regions->region->categories->categorie; 
while($category = current($categories)){ 
    echo $category . next($categories) ? ', ' : ''; 
} 
0
<? foreach($movie->regions->region->categories->categorie as $category) { ?> 
<p>Categori: <?= $category ?></p> 
<? } ?> 
19

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

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

+0

@TomcatExodus: +1, inteligente. – Jonah

+0

@Tomcat: +1 para el uso de próximo y actual ... – prodigitalson

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

    return implode(', ', $cats); 

} 

A continuación, puede jsut llamarlo desde su bucle como:

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

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

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

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

Así es como se utiliza foreach con un SimpleXMLElement:

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

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; 
} 
Cuestiones relacionadas