2011-01-09 9 views
6

Chi conosce PHP e XML? Allora per favore dai un'occhiata!Come utilizzare foreach con PHP e XML (simplexml)

Questo è il mio codice 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> 

<? } ?> 

Questo è MYS file 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> 

L'esito del codice di cui sopra è:

<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 voglio essere così (vedi la categoria del primo film):

<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: Anche io chiedo come ottenere la virgola tra le parole, ma senza una virgola sull'ultima parola ...

risposta

1

È necessario scorrere gli elementi categorie anche, nello stesso modo in cui si 'ha iterato attraverso movies.

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

probabilmente si vorrà per tagliare il finale , pure.


Il metodo di cui al mio commento:

$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

Prova questo.

<?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 per escludendo la virgola finale. 'while ($ category = current ($ movie -> ...-> categorie))' e 'echo next ($ movie -> ...-> categorie)? ',': ''; 'funziona anche. – Dan

+0

@TomcatExodus: +1, intelligente. – Jonah

+0

@Tomcat: +1 per l'utilizzo di next e current ... – prodigitalson

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

    return implode(', ', $cats); 

} 

Poi si può chiamare sono finite dal ciclo come:

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

Utilizzando un array e implode elimina la necessità per la logica di conteggio e rilevare l'ultima categoria.

L'isolamento in una funzione semplifica la manutenzione e crea meno confusione rispetto all'annidamento del ciclo (sebbene i cicli nested dichiarati non siano che confusione).

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

questo è il modo di utilizzare foreach con una SimpleXMLElement:

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

provare questo

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