Tri des tableaux avec foreach?

Eléphanteau du PHP | 35 Messages

22 déc. 2006, 11:43

Bonjour a tous,

Je souhaiterais trier un tableau en fonction d'un champ date. Voici le code en php pour la création du tableau :
$library = simplexml_load_file('rss_mix.php5');
  foreach ($library->channel as $shelf) {
      foreach ($shelf->item as $item) {
          printf("<br />%s\n", $item->title);
          printf("<br />%s\n", $item->pubDate);
      }
  }
Est-il possible d'afficher par exemple les 5 dernières news par date?

Merci d'avance.

MAx

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

22 déc. 2006, 12:09

Il y a des tas de fonctions de tri sur les tableaux, voici la plus simple : sort()

Les autres sont liées.

Eléphanteau du PHP | 35 Messages

22 déc. 2006, 14:16

Merci pour ta réponse si rapide.

J'ai finalement opté pour ceci :
<?
include ('test.php5');
foreach ($data as $key => $row) {
   $title[$key]  = $row['title'];
   $pubDate[$key] = $row['pubDate'];
}

array_multisort($pubDate, SORT_DESC, $title, SORT_ASC, $data);

for ($i = 0; $i < count($pubDate); $i++){
	echo "<ul><li>".$title[$i]."</li></ul>";
	echo "Date : ".$pubDate[$i]."<br />";
}
?>
Cela fonctionne parfaitement :)

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 déc. 2006, 14:55

Pour info, je me suis demandé en lisant ce topic si cela aurait été plus facile ou plus clair en utilisant XSLT. Une petite dizaine de minutes plus tard voici le résultat : (ça comprend le temps de télécharger un fichier RSS sur le web et apprendre chez le w3c comment se servir de <xsl:sort />)

rss.xsl:

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="iso-8859-1" /> <xsl:template match="/"> <ul><xsl:for-each select="rss/channel/item"> <xsl:sort select="pubDate" order="descending" /> <xsl:if test="position() < 5"> <li><xsl:value-of select="title" /> (<xsl:value-of select="pubDate" />)</li> </xsl:if> </xsl:for-each></ul> </xsl:template> </xsl:stylesheet>
rss.php:
<?php

$xsl = new DOMDocument;
$xsl->load('rss.xsl');

$xml = new DOMDocument;
$xml->load('rss.xml');

$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);

echo $proc->transformToXML($xml);
Si vous ne connaissez pas XSLT ça ne vous dira peut-être pas grand-chose, mais l'expérience s'est révelée étonamment simple. (la logique commence au premier <ul> le reste c'est le gabarit de base des fichiers XSLT)

Eléphanteau du PHP | 35 Messages

22 déc. 2006, 15:35

Cela aurait pu etre interessant, mais malheureusement je dépends des fichiers xml se trouvants sur des sites externes.

Mais merci pour l'information.

Max

Eléphanteau du PHP | 35 Messages

22 déc. 2006, 15:37

J'en profite pour poser une autre petite question.

Avec le code suivant :
$library = simplexml_load_file('fichier.xml');
  foreach ($library->channel as $shelf) {
      foreach ($shelf->item as $item) {
		$data[] = array('title' => ($item->title), 'pubDate' => strtotime(($item->pubDate)));
      }
  }
Comment puis je ne garder que les 5 premières news?

Merci :)

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

22 déc. 2006, 15:43

je dépends des fichiers xml se trouvants sur des sites externes.
Ben tu remplaces le chemin local par l'URL en question, ça devrait marcher de la même façon.

Pour ta dernière question, je ne sais pas, en revanche je crois savoir que tu peux remplacer ton code actuel par
$library = simplexml_load_file('fichier.xml');

foreach ($library->channel->item as $item)
{
	$data[] = array(
		'title'   => $item->title,
		'pubDate' => strtotime($item->pubDate)
	);
}
C'est la magie de SimpleXML. Quant aux parenthèses supplémentaires, elles sont inutiles.