2009-11-25 6 views
0

J'ai commencé à utiliser la fonction simplexml qui semble mieux fonctionner que l'autre précédent analyseur que j'ai essayé d'utiliser. Je suis arrivé à l'étape où j'ai besoin de trier les articles par transmissiondate - J'ai essayé d'utiliser le uasort mais ne fait aucun changement dans l'ordre des articles.Comment trier un flux XML avec SimpleXML

aussi parfois un programme est sur plus d'une fois le même jour - serait-il plus facile de trier videoID peut aider?

ce que l'objet ressemble à:

[0] => SimpleXMLElement Object 
    (
     [VideoID] => 108059 
     [Genre] => Music 
     [ProgrammeName] => MTV 
     [OriginalAiringDate] => 2009-11-10T19:22:24 
     [TransmissionDate] => 2009-11-10T19:22:24 
    ) 
[1] => SimpleXMLElement Object 
    (
     [VideoID] => 108395 
     [ExpiryDate] => 2009-12-12T23:59:59 
     [DateCreated] => 2009-11-12T13:28:54 
     [Genre] => Music 
     [ProgrammeName] => MTV 
     [OriginalAiringDate] => 2009-11-12T19:22:32 
     [TransmissionDate] => 2009-11-12T19:22:32 
) 

$xml = simplexml_load_file("data.xml"); 
$count = 0; 
$sortItem = 0; 
$dateformat = "D j M, g:ia"; 
$sortArray = array(); 
foreach($xml->CatchUp as $item){ 
$sortArray[$count][TransmissionDate] = $item; 
if($count < 4){ 
print "<p>Programme Name:<strong> " . $item->ProgrammeName. "</strong></p>"; 
print "<p>Date Shown:<strong> " . date($dateformat, strtotime($item->TransmissionDate)). "</strong></p>"; 
print "<p>Description:<strong> " . trunc($item->ShortSynopsis,30, " ")."</strong></p>"; 
print "<p><a href='". $item->VideoID. "'>". $item->VideoID."</a></p>"; 
     $count++; 
    } 
} 

}

asort (sortArray $);

Répondre

1

Je vois deux façons de le faire. Le premier serait de créer un tableau contenant les valeurs TransmissionDate, puis un autre tableau contenant les nœuds correspondants, puis utiliser array_multisort(). Ceci est un peu fastidieux, voici donc ce que je ferais à la place: télécharger et utiliser SimpleDOMsortedXPath()

include 'SimpleDOM.php'; 

$xml = simpledom_load_file("data.xml"); 
$dateformat = "D j M, g:ia"; 

foreach($xml->sortedXPath('CatchUp[ProgrammeName="MTV"]', 'TransmissionDate') as $i => $item) 
{ 
    if ($i == 4) 
    { 
     // I assume you only want the first 4 
     break; 
    } 
    print "<p>Programme Name:<strong> " . $item->ProgrammeName. "</strong></p>"; 
    print "<p>Date Shown:<strong> " . date($dateformat, strtotime($item->TransmissionDate)). "</strong></p>"; 
    print "<p>Description:<strong> " . trunc($item->ShortSynopsis,30, " ")."</strong></p>"; 
    print "<p><a href='". $item->VideoID. "'>". $item->VideoID."</a></p>"; 
} 
+0

Great Josh cela fonctionne, un petit problème, si je veux filtrer par le nom, par exemple, en montrant seulement le premier 4 émission de MTV seulement. comme si ($ item-> Program == "MTV") {} son semble rompre – NiseNise

+0

Le premier argument est une expression XPath. 'CatchUp' signifie" tous les nœuds enfants nommés 'CatchUp'" - vous pouvez ajouter un prédicat tel que: 'CatchUp [ProgrammeName =" MTV "]' qui le transforme en "tous les nœuds enfants nommés' CatchUp' ayant eux-mêmes un nœud fils nommé 'ProgramName' dont la valeur est' 'MTV''" - voir http://www.w3schools.com/XPath/xpath_syntax.asp –

+0

En parlant de XPath, je devrais aussi mentionner que vous pouvez l'utiliser pour limiter votre recherche au premier N éléments en ajoutant le prédicat '[position() <= 4]', supprimant le besoin d'un compteur en PHP. Je ne l'ai pas mentionné pour le rendre simple aux débutants, mais toute personne qui doit manipuler XML devrait regarder XPath parce que c'est vraiment puissant et en fait assez facile une fois que vous avez appris les bases. –

0

essayer d'utiliser la coulée en tirant des données de votre objet SimpleXMLElement

utilisant id vidéo: $sortArray[$count][VideoID] = (int)$item;

+0

très nouveau pour SimpleXML ce qui est coulée ??? – NiseNise

+0

Merci cedko80, il n'a pas fonctionné l'ordre reste le même foreach($xml->CatchUp as $item){ $sortArray[$count]['VideoID'] = (int)$item; \t if($count < 4){ .... \t \t $count++; \t } } asort($sortArray); NiseNise