SimpleXML e ciclo FOR

  • Creatore Discussione Creatore Discussione archema
  • Data di inizio Data di inizio

archema

Nuovo Utente
29 Dic 2012
13
0
0
Salve a tutti.
Premessa: Ho un file XML postato su un'altro server che devo leggere e listare sul mio sito.
Questo file è costituito da molti articoli (250 per l'esattezza) ma a me ne bastano 5 da inserire sul mio sito.
Seguendo un breve tutorial sulla rete ho trovato un codice php che implementa l'uso del FOREACH, il quale mi lista tutto il contenuto dell'array ed è il seguente:

PHP:
<?

$leggimi = simplexml_load_file("news.xml");

$news = $leggimi->articolo;

foreach($news as $xmldati){

echo "Titolo : ".$xmldati->titolo."<br>";
echo "Data : ".$xmldati->data."<br>";
echo "Articolo : ".$xmldati->testo."<br>";
echo "<hr>";
}

?>

io ho provato in tutti i modi a implementare l'uso del ciclo FOR nel modo qui sotto, ma non funziona:


PHP:
<?
$dbi = simplexml_load_file("http://www.sito.com/news_for_your_site.xml");

$news = $dbi->articolo;

$i=0;

for($i=0; $i<5; $i++){

echo "Titolo : ".$news[$i][title]."<br>";
echo "Data : ".$news[$i][data]."<br>";
echo "Articolo : ".$news[$i][descrizione]."<br>";
echo "<hr>";

}

?>

non funziona ... inoltre ignoro il significato di questa porzione di codice: $news = $dbi->articolo; ma ho tentato di scriverla a partire dcall'esempio.

chiunque può aiutarmi sarà ringraziato da subito.

Saluti
Archema
 
Ultima modifica di un moderatore:
ciao
forse potresti trasformare prima l'object risultante in array e poi stampare l'array

PHP:
<?php
$leggimi = simplexml_load_file("news.xml");
$news = $leggimi->articolo;
foreach($news as $xmldati){
	$titolo[]=$xmldati->titolo;
	$data[]=$xmldati->data;
	$articolo[]=$xmldati->testo;
}
for($k=0;$k <5;$k++){
	echo "titolo: ".$titolo[$k]."<br />";
	echo "data: ".$data[$k]."<br />";
	echo "articolo: ".$articolo[$k]."<br />";
}
?>
al massimo non funzia

poi sei sicuro della struttura del file xml? se no prova questo mini script
PHP:
<?php
$leggimi = simplexml_load_file("news.xml");
print_r($leggimi);
?>
dovrebbe stampartela

p.s.
non usare lo short tag <? ma <?php
 
Lo avevo capito da me che qui c'è gente in gamba...

Il primo script funziona a meraviglia....


Grazie... grazie ancora! :fonzie::fonzie::fonzie:

PS:

Dopo aver fatto la connessione all'XML con
PHP:
$leggimi = simplexml_load_file("news.xml");
... la variabile $leggimi posso considerarla a tutti gli effetti un Array?

Lo chiedo perchè vorrei applicare degli SORT by DATA, o degli sort by RATING.
Infatti nel file XML ci sono dei tag: DATA, RATING e CATEGORY... con i quali vorrei poter ordinare il contenuto del file XML.


Grazie ancora per la pronta risposta.

Saluti
Archema
 
Lo avevo capito da me che qui c'è gente in gamba...
Dopo aver fatto la connessione all'XML con
PHP:
$leggimi = simplexml_load_file("news.xml");
... la variabile $leggimi posso considerarla a tutti gli effetti un Array?
$leggimi diventa un oggetto con degli attributi che sono degli array, quindi come ti ha mostrato borgo facendo ad esempio cosi
PHP:
$news = $leggimi->articolo;
$news diventa a tutti gli effetti un array (che a sua volta puo avere degli oggetti con altri array) ma $leggimi rimane un oggetto
 
$leggimi diventa un oggetto con degli attributi che sono degli array, quindi come ti ha mostrato borgo facendo ad esempio cosi
PHP:
$news = $leggimi->articolo; 
[:byebye:/php]
$news diventa a tutti gli effetti un array (che a sua volta puo avere degli oggetti con altri array) ma $leggimi rimane un oggetto[/QUOTE]

grazie mille, ho compreso.

buon fine settimana a tutti!
 
ciao
propongo un alternativa:
incrementi una variabile e la usi per fermare il ciclo while
PHP:
<?php
$leggimi = simplexml_load_file("news.xml");
$news = $leggimi->articolo;

$i = 0; // inizializzi il contatore
foreach ($news as $xmldati) {
    $i++; // lo incrementi
    echo "Titolo : " . $xmldati->titolo . "<br>";
    echo "Data : " . $xmldati->data . "<br>";
    echo "Articolo : " . $xmldati->testo . "<br>";
    echo "<hr>";
    if ($i == 5) {
        break; // fermi il ciclo
    }
}
 
Correggo una mia affermazione fatta prima dato che mi ricordavo male, $news diventa in questo caso un'istanza del primo oggetto passato non un array effettivo e cosi anche con gli altri, in pratica totalmente un array non dovrebbe mai diventarlo almeno se non utilizzando una conversione implicita fatta dall'utente

Colgo l'occasione per mostrare un esempio e un eventuale alternativa
PHP:
<?php
$leggimi = simplexml_load_file("news.xml");
$news = json_decode(json_encode($leggimi),true);

foreach (array_values($news['articolo']) as $key => $xmldati) {
    echo "Titolo : " . $xmldati['titolo'] . "<br>";
    echo "Data : " . $xmldati['data'] . "<br>";
    echo "Articolo : " . $xmldati['testo'] . "<br>";
    echo "<hr>";
    if($key==4) break; //volendo stampare 5 articoli, dato che le chiavi partono da 0 si ferma a 4
}
 
Ultima modifica:
ciao
propongo un alternativa:
incrementi una variabile e la usi per fermare il ciclo while
PHP:
<?php
$leggimi = simplexml_load_file("news.xml");
$news = $leggimi->articolo;

$i = 0; // inizializzi il contatore
foreach ($news as $xmldati) {
    $i++; // lo incrementi
    echo "Titolo : " . $xmldati->titolo . "<br>";
    echo "Data : " . $xmldati->data . "<br>";
    echo "Articolo : " . $xmldati->testo . "<br>";
    echo "<hr>";
    if ($i == 5) {
        break; // fermi il ciclo
    }
}

che dire... il codice funziona a meraviglia ed é pure pulito e semplice all'aspetto.

volendo riallacirmi all'ultimo messaggio di Nefyt purtroppo é vero, non viene restituito un array, quindi non posso usare una funzione di array sort ne su $leggimi ne su $news.
avete qualche idea per trasformare $news da un oggetto ad un array multidimensionale?

ho trovato qualche funzione in giro, ma non funge! appena posso le posto...

grazie.

Archema
 
L'esempio che ti ho mostrato lo trasforma già in un array multidimensionale, puoi verificarlo anche tramite var_dump o ciclo
 

Discussioni simili