Trie sur un flux xml

Paulux33
Invité n'ayant pas de compte PHPfrance

16 juil. 2007, 10:31

Bonjour,

Mon souci est simple : Je reçois un flux XML structuré tel que ci-dessous.

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1" ?> <Response> <Merchand Code="NFF" Name="Nouvelles Frontières" Link="http://www.MyWebSite.com/Logos/NFF.gif"> <Airline Code="AA" Link="http://www.MyWebSite.com/cie/AA.gif"> <Details TotalPrice="661.25" Currency="EUR" Avalability="Y" Type="AR"> <Facts> <OutBound TravelDay="2007-09-10" ShiftedDay="N" Depart="CDG" Arrive="MEX" DirectFlight="Y"> <Times Departing="10:00:00" Arriving="21:50:00" OtherDay="0" /> </OutBound> <InBound TravelDay="2007-09-25" ShiftedDay="N" Depart="MEX" Arrive="CDG" DirectFlight="Y"> <Times Departing="10:55:00" Arriving="09:20:00" OtherDay="1" /> </InBound> </Facts> </Details> </Airline> <Airline Code="IB" Link="http://www.MyWebSite.com/cie/IB.gif"> <Details TotalPrice="465.32" Currency="EUR" Avalability="Y" Type="AR"> <Facts> <OutBound TravelDay="2007-09-10" ShiftedDay="N" Depart="CDG" Arrive="MEX" DirectFlight="Y"> <Times Departing="11:30:00" Arriving="23:32:00" OtherDay="0" /> </OutBound> <InBound TravelDay="2007-09-24" ShiftedDay="Y" Depart="MEX" Arrive="CDG" DirectFlight="Y"> <Times Departing="10:55:00" Arriving="09:20:00" OtherDay="1" /> </InBound> </Facts> </Details> </Airline> </Merchand> <Merchand Code="OPO" Name="OPODO" Link="http://www.MyWebSite.com/Logos/OPO.gif"> <Airline Code="AZ" Link="http://www.MyWebSite.com/cie/AA.gif"> <Details TotalPrice="600.20" Currency="EUR" Avalability="Y" Type="AR"> <Facts> <OutBound TravelDay="2007-09-10" ShiftedDay="N" Depart="CDG" Arrive="MEX" DirectFlight="Y"> <Times Departing="10:00:00" Arriving="21:50:00" OtherDay="0" /> </OutBound> <InBound TravelDay="2007-09-25" ShiftedDay="N" Depart="MEX" Arrive="CDG" DirectFlight="Y"> <Times Departing="10:55:00" Arriving="09:20:00" OtherDay="1" /> </InBound> </Facts> </Details> </Airline> <Airline Code="MX" Link="http://www.MyWebSite.com/cie/MX.gif"> <Details TotalPrice="944.02" Currency="EUR" Avalability="Y" Type="AR"> <Facts> <OutBound TravelDay="2007-09-10" ShiftedDay="N" Depart="CDG" Arrive="MEX" DirectFlight="Y"> <Times Departing="10:00:00" Arriving="21:50:00" OtherDay="0" /> </OutBound> <InBound TravelDay="2007-09-25" ShiftedDay="N" Depart="MEX" Arrive="CDG" DirectFlight="Y"> <Times Departing="10:55:00" Arriving="09:20:00" OtherDay="1" /> </InBound> </Facts> </Details> </Airline> </Merchand> </Response>
Pour générer mon affichage, je souhaite le trier par ordre croissant de prix (à savoir « <Details TotalPrice=… »

Je suis en PHP5 et utilise simple_XML. Y a-t-il un moyen de signifier quelque part les éléments de trie ?

Ou bien dois-je passer par une classe du Type Xml_In_Array. Si oui, il y a bien usort mais la fonction doit être coton !

Quelqu’un peut-il m’aider sur le sujet ?

Merci d’avance,
[/code]

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

16 juil. 2007, 12:33

A priori je pense qu'il va te falloir passer par un tableau. On pourrait imaginer créer le tableau en appelant xpath() puis le trier par usort(), ou encore plus simplement on crée une liste de prix et une liste d'objets dans le même ordre. On trie la liste de prix en préservant les clés et à partir de la liste triée on peut utiliser la liste d'objets dans le bon ordre. Par exemple :
$sort = $ref = array();
foreach ($xml->xpath('//Airline') as $airline)
{
	$sort[] = $airline->Details['TotalPrice'];
	$ref[] = $airline;
}

asort($sort, SORT_NUMERIC);

foreach ($sort as $k => $void)
{
	$airline = $ref[$k];

	echo $airline->asXML(),"\n";
}
Sinon, tu pourrais transformer ton XML par XSLT et l'élément <xsl:sort>, utilise ce qui te convient le mieux. (XSLT peut transformer du XML en XML, ce n'est pas forcément XML => (X)HTML)