SimpleXML e ciclo FOR

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:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
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
 

archema

Nuovo Utente
29 Dic 2012
13
0
0
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
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
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
 

archema

Nuovo Utente
29 Dic 2012
13
0
0
$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!
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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
    }
}
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
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:

archema

Nuovo Utente
29 Dic 2012
13
0
0
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
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
L'esempio che ti ho mostrato lo trasforma già in un array multidimensionale, puoi verificarlo anche tramite var_dump o ciclo