IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] tri tableau php


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 5
    Points
    5
    Par défaut [Tableaux] tri tableau php
    Bonsoir,
    j'essaie de trier le tableau suivant mais je ne sais pas comment m'y prendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $tab = array();
     
        foreach ($liste as $item ) {
     
    $tab[]['date'] = $item[pubdate];
    $tab[]['titre'] = $item[title];
    $tab[]['descr'] = $item[description];
     
    }
    je souhaiterais trier les éléments par rapport à la date (ce sont des rss que je souhaiterais récupérer et trier par ordre de parution)
    merci de votre aide

  2. #2
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Bonsoir,

    Déjà tu as une erreure dans ton code (les quotes dans les array).
    Ensuite cela dépend du format de la date (Unixtime ?, String date ?, etc...)
    PHP t'offre une panoplis de function de tri comme sort, bsort, asort, arsort, etc.... tu trouvras sans doute ce que tu cherches

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 5
    Points
    5
    Par défaut
    merci de ta réponse,
    c'est une date format unix je pense AAAA-MM-JJ heure,
    j'ai essayé avec différentes fonctions, même sans les quotes mais je n'ai pas compris grand chose aux tableaux

  4. #4
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Les fonctions de tri proposées dans la bibliothèque PHP effectuent des tris sur les éléments des tableaux qu'on leur fournit. Par défaut (sort, asort, etc...) le tri s'effectue selon une fonction d'ordre classique avec l'opérateur < et l'opérateur == des types scalaires qui constituent les éléments du tableau.

    Ce qui suppose que les éléments de ton tableau ont un type et une sémantique homogène. Si tu as un tableau de chaines de caractères, tu obtiendras par sort( $array ) un tableau de chaînes de caractères triées par ordre croissant. Mais si certaines de tes chaines ont un autre sens que certaines autres chaînes, hé bien.... tu obtiendras toujours un tableau de chaines triées par ordre croissant mais cet ordre ne voudra rien dire.

    Pour en revenir à ta question, si je comprends bien : tu as un tableau de tableaux : $liste contient des $items qui sont des tableaux à 3 postes. Tu veux trier $liste par $item['pubdate'] croissant.
    Or, dans ta boucle, tu mets $liste à plat dans deuxième tableau à deux dimensions : $tab est un tableau de tableaux à 1 poste.

    Visualisation : le code de test (je t'engage à faire ce genre de tests chez toi, c'est un bon entrainement pour poser les problèmes clairement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $tab = array();
    $liste = array();
    $liste[] = array( 'pubdate' => '2007-02-03', 'title' => 'titre1', 'description'=> 'aa' );
    $liste[] = array( 'pubdate' => '2007-02-01', 'title' => 'titre2', 'description'=> 'aa' );
    $liste[] = array( 'pubdate' => '2007-02-02', 'title' => 'titre3', 'description'=> 'aa' );
     
    foreach ($liste as $item ) {
    	$tab[]['date'] = $item['pubdate'];
    	$tab[]['titre'] = $item['title'];
    	$tab[]['descr'] = $item['description'];
    }
     
    echo 'Voici $liste : ';
    print_r( $liste );
    echo 'Voici $tab : ';
    print_r( $tab );
    Le résultat (dump des deux tableaux) :
    Voici $liste :
    Array (
    [0] => Array ( [pubdate] => 2007-02-03 [title] => titre1 [description] => aa )
    [1] => Array ( [pubdate] => 2007-02-01 [title] => titre2 [description] => aa )
    [2] => Array ( [pubdate] => 2007-02-02 [title] => titre3 [description] => aa )
    )

    Voici $tab :
    Array (
    [0] => Array ( [date] => 2007-02-03 )
    [1] => Array ( [titre] => titre1 )
    [2] => Array ( [descr] => aa )
    [3] => Array ( [date] => 2007-02-01 )
    [4] => Array ( [titre] => titre2 )
    [5] => Array ( [descr] => aa )
    [6] => Array ( [date] => 2007-02-02 )
    [7] => Array ( [titre] => titre3 )
    [8] => Array ( [descr] => aa )
    )
    Je ne pense pas que c'est ce que tu cherches.
    Donc, pour ton problème :

    1 - Soit c'est un exercice de cours : tu veux trier $liste tel quel (sans le modifier) en fonction de $liste[n]['pubdate'] et tu dois écrire une petite fonction de tri toi-même pour faire en sorte de réorganiser les éléments.

    2 - Soit ce n'est pas un exercice de cours et tu as la solution toute faite dans les fonctions asort() ou plus probablement uasort() de la bibliothèque PHP. Voir la doc pour les détails, les exemples sont assez bien expliqués. D'après ce que je comprends de ton problème, uasort + une callback de 3 lignes fera l'affaire.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 5
    Points
    5
    Par défaut
    Merci infiniment pour ton explication Herode, j'avais du mal avec les tableaux.
    je teste et vous tiens au courant

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 5
    Points
    5
    Par défaut
    j'ai vraiment du mal avec les tableaux, je ne pensais pas que c'était aussi compliqué.
    j'essai de récupérer des rss avec magpie et ensuite de les afficher par date de parution.
    voici le script complet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php 
     
    require_once "magpierss/rss_fetch.inc";
     
    $source = array();
     
    $source[0] = "http://www.lemonde.fr/rss/sequence/0,2-3214,1-0,0.xml";
    $source[1] = "http://www.lemonde.fr/rss/sequence/0,2-651865,1-0,0.xml";
    $source[2] = "http://www.lemonde.fr/rss/sequence/0,2-3260,1-0,0.xml";
     
    if ($source){
     
    for ($i=0; $i<=6; $i++){
     
    $rss = fetch_rss($source[$i]);
     
     
    if (is_array($rss->items))
     
        {
        $liste = array_slice($rss->items, 0, 3);
     
    print_r($liste);
    }
    }
    }
    ?>
    je voudrais trier te tableau $liste par rapport à la date $item[pubdate] et ne garder que : item[pubdate], item[titre] et item[description].

    Si vous pouviez m'aider ça serait vraiment sympa, ça fait un moment que je galère.
    Merci

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    Si tu as un tableau à plusieurs dimensions que tu dois trier il va falloir coder un peu (ou alors je ne connais pas la fonction qui le fait).

    Un exemple a déjà été donné il y a quelques jours, en utilisant un nouveau tableau que tu trieras au fur et à mesure du parcours du premier.
    Tout pas mieux que tout le monde : évitez les questions techniques en mp sinon à quoi bon poster sur un forum ?

    Petite citation : "Le sage cherche la vérité, l'imbécile l'a déjà trouvée"

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 5
    Points
    5
    Par défaut
    j'ai bien essayé de créer un nouveau tableau à partir de $liste en insérant les valeurs que je souhaite garder mais ça coince :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $tab = array();
    foreach ($liste as $item) {
        $tab[]=$item[pubdate];
        $tab[]=$item[title];
        $tab[]=$item[description];
    }
    j'ai un nouveau tableau, j'affiche bien les valeurs mais pour le tri j'ai du mal

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    Trouvé en tapant tri tableau dans la recherche ^^
    http://www.developpez.net/forums/sho...ht=tri+tableau
    Tout pas mieux que tout le monde : évitez les questions techniques en mp sinon à quoi bon poster sur un forum ?

    Petite citation : "Le sage cherche la vérité, l'imbécile l'a déjà trouvée"

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 5
    Points
    5
    Par défaut
    merci,
    j'avais vu le topic, mais lui il a des valeurs précises : 1, 2 ou 3
    moi je suis un peu coincé

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    Que ce soit des numéros ou des chaines php le gère de la même façon.

    "a" > "b" te renverra faux par exemple.

    Il te suffit donc de trier ton tableau en fonction de la chaine que tu souhaites.

    Il existe plusieurs algos classiques de tri, mais si tu débutes je te conseille soit de faire un algo standard de tri, soit de récupérer le principe mais pas un algo tout fait, histoire de te faire la main.
    Tout pas mieux que tout le monde : évitez les questions techniques en mp sinon à quoi bon poster sur un forum ?

    Petite citation : "Le sage cherche la vérité, l'imbécile l'a déjà trouvée"

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 5
    Points
    5
    Par défaut
    merci Ratapapa,
    ça fait 3 jours que j'essaie plusieurs trucs mais je n'y arrive pas que j'ai vu sur les forums et sur la doc mais je ne pige rien

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 5
    Points
    5
    Par défaut
    je reprend l'explication de Herode plus haut :

    Voici $tab :
    Array (
    [0] => Array ( [date] => 2007-02-03 )
    [1] => Array ( [titre] => titre1 )
    [2] => Array ( [descr] => aa )
    [3] => Array ( [date] => 2007-02-01 )
    [4] => Array ( [titre] => titre2 )
    [5] => Array ( [descr] => aa )
    [6] => Array ( [date] => 2007-02-02 )
    [7] => Array ( [titre] => titre3 )
    [8] => Array ( [descr] => aa )
    )


    c'est bien ce que je veux obtenir avec les dates décroissantes : titre et description de la plus récente date et ainsi de suite

  14. #14
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Erreur, petit scarabée, tu ne peux pas vouloir cela ^^
    Car
    1 - au lieu de faire un tableau de tableaux à un poste, il suffirait de faire un tableau de chaines de caractères.
    2 - si tu scindes les items, tu perds la cohérence. Un item en tant que tableau de 3 postes (sur l'exemple en tout cas) est une structure qui te permet d'être sûr (par construction) que les 3 données sont liées. Tu ne peux pas mettre la date de l'item 2 avec le titre de l'item 3 par exemple. Tu aurais aussi pu décider qu'Item est une classe à 3 attributs plutôt qu'un tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Item {
      private $itemDate = '';
      private $title = '';
      private $chépukoi = '';
      __construct Item( $dt, $title, $truc ) { /*init...*/ }
      [etc...]
    }
    D'ailleurs, n'est-ce pas là ce qu'il faut penser ? Si tu oublies que les items sont des tableaux,
    1 - tu te retrouves avec $liste qui est un tableau d'Items que tu veux ordonner.
    2 - tu dois donc trouver l'algo qui te permet de classer un tableau en général. Commence par trouver l'algo en imaginant que tu as un simple tableau de chiffres. Après quoi tu peux procéder à l'abstraction qui fait de ton algo un algo utilisable dans le cas général. En maths, la relation d'ordre s'appelle '<', mais comme tu veux ordonner n'importe quoi, tu peux abstraire cela en décidant que la relation d'ordre est une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function isLower( $val1, $val2 ) { ...}
    Reste donc à trouver le code de la fonction. Fastoche dans ton cas puisque les objets que tu as à ordonner sont des Items et que ces items sont des tableaux à 3 postes dont l'un t'intéresse plus particulièrement : $item['date']
    Ta fonction d'ordre devrait donc ressembler à un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function isLower( $val1, $val2 ) { 
    // $val1 et $val2 sont des Items...
    if ( $val1['date'] < $val2['date'] ) return -1; // $val1 < $val2
    if ( $val1['date'] == $val2['date'] ) return 0; // $val1 == $val2
    return 1; // $val1 > $val2
    }
    Le plus dur est donc de trouver un algo de tri correct, mais cette partie là de l'excercice est totalement indépendante du type des objets que tu as dans ton tableau.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 5
    Points
    5
    Par défaut
    merci Herode, tu es un chef.
    J'allais finir par abandonner et passer par une table mysql que j'arrive mieux à faire fonctionner.

    maintenant je vais utiliser usort($liste,"isLower")

    Je teste tout à l'heure et je te tiens au courant

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 5
    Points
    5
    Par défaut
    c'est la galère, la galère, la galère tralala...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function isLower( $val1, $val2 ) { 
    // $val1 et $val2 sont des Items...
    if ( $val1['date'] < $val2['date'] ) return -1; // $val1 < $val2
    if ( $val1['date'] == $val2['date'] ) return 0; // $val1 == $val2
    return 1; // $val1 > $val2
    }
    je déclare la fonction ci-dessus, ensuite pour faire mon tri par la date il faut que dans mon tableau je lui signale lequel est le cham date.

    donc je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $liste = array_slice($rss->items, 0, 3);
     foreach ($liste as $item ) {
    $liste[] = array( 'date' => $item[pubdate], 'title' => $item[title], 'description'=> $item[description] );
     
    }
    uasort($liste,"isLower");
    ça ne marche pas.

    Donc je me dis il faut que je fasse un autre tableau :
    alors je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $liste = array_slice($rss->items, 0, 3);
     foreach ($liste as $item ) {
    $tab[] = array( 'date' => $item[pubdate], 'title' => $item[title], 'description'=> $item[description] );
     
    }
    uasort($tab,"isLower");
    j'ai mes valeurs mais le tri ne donne rien

    j'en peux plus!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  17. #17
    Membre éprouvé Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Points : 933
    Points
    933
    Par défaut
    Le champ 'date' que j'indiquais dans isLower(), c'est juste pour l'exemple. La callback est à adapter à chaque cas. Pour toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $liste = array();
    $liste[] = array( 'pubdate' => '2007-02-03', 'title' => 'titre1', 'description'=> 'aa' );
    $liste[] = array( 'pubdate' => '2007-02-01', 'title' => 'titre2', 'description'=> 'aa' );
    $liste[] = array( 'pubdate' => '2007-02-02', 'title' => 'titre3', 'description'=> 'aa' );
     
    function isLower( $val1, $val2 ) { 
    	// $val1 et $val2 sont des Items...
    	if ( $val1['pubdate'] < $val2['pubdate'] ) return -1; // $val1 < $val2
    	if ( $val1['pubdate'] == $val2['pubdate'] ) return 0; // $val1 == $val2
    	return 1; // $val1 > $val2
    }
     
    if ( ! uasort( $liste, 'isLower' ) ) echo 'arg !<p>';
    else print_r( $liste );
    Evidemment, si ta colonne s'appelle autrement que 'pubdate', il faut avoir une autre callback avec le bon nom de colonne. De même que si chaque poste de $liste était un objet de classe Item, il faudrait consulter dans isLower() le bon attribut de ton objet.

    Peut-être n'ai-je pas été clair sur mes posts précédents, alors j'insiste : la callback que tu écris est spécifique à un type donné. Un tableau de 3 postes dont l'un s'appelle 'pubdate' est un type à soi tout seul, et un tableau de 3 postes dont l'un s'appelle 'tagada' est un autre type encore. De même que chaque classe déclarée et chaque type scalaire est potentiellement un autre type. Autant de types, autant de callbacks (sauf que pour les types scalaires, les callbacks sont déjà écrites : opérator < par exemple, et les fonctions qui les utilisent sont déjà codées : sort() ou asort() par exemple)

    Note qu'avec ce système de callbacks, tu peux en écrire plusieurs pour trier la même chose selon des ordres différents : l'une par 'pubdate' croissant, l'autre par 'title' croissant, une autre en fonction du carré du rang alphabétique de la deuxième lettre de la description moins le cube du rang alpha de la cinquième lettre s'il y en a une, moins 253 412 sinon, etc...

    Quoi il est bidon mon dernier exemple ?

Discussions similaires

  1. [Tableaux] Tri tableau avec underscore et chiffres
    Par __fabrice dans le forum Langage
    Réponses: 4
    Dernier message: 18/10/2006, 17h05
  2. [Tableaux] tri tableau avec date
    Par omelhor dans le forum Langage
    Réponses: 12
    Dernier message: 17/10/2006, 20h24
  3. [Tableaux] classer tableau php
    Par NoBreak2004 dans le forum Langage
    Réponses: 7
    Dernier message: 16/10/2006, 00h59
  4. [Tableaux] affichage tableau php apres requete sql count
    Par heteroclite dans le forum Langage
    Réponses: 1
    Dernier message: 13/09/2006, 20h53
  5. [Tableaux] Tri tableau
    Par licorne dans le forum Langage
    Réponses: 3
    Dernier message: 20/03/2006, 12h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo