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] Trier un tableau en gardant les associations


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 45
    Points : 32
    Points
    32
    Par défaut [Tableaux] Trier un tableau en gardant les associations
    bonjour,

    ca fait qque temps que je suis sur ce problème de tri... :s
    j'ai essayé array_multisort() mais je n'arrive à rien, peut-être que je l'utilise mal...

    mon tableau1 regroupe les personnes Française:
    (date, nom, prenom, ville)
    ex:
    1985-10-03 11:03:21, Petit, Jean, Marseille
    1986-10-11 22:02:51, Durant, Jacques, Paris
    1995-02-03 11:11:11, Fort, Miguel, Nancy

    mon tableau2 regroupe les personnes Belge:
    (date, nom, prenom, ville)
    ex:
    1984-12-04 14:13:15, Rodolf, Arry, Bruxelles
    1987-11-06 14:30:00, Pazoni, Alfred, Gand
    1994-01-01 10:15:02, Blangean, Serge, Hasselt


    mes 2 tableaux sont triés par ordre croissant de date

    j'ai concatené mes deux tableaux via array_merge
    j'obtient ceci, tableau_resultat:

    1985-10-03 11:03:21, Petit, Jean, Marseille
    1986-10-11 22:02:51, Durant, Jacques, Paris
    1995-02-03 11:11:11, Fort, Miguel, Nancy
    1984-12-04 14:13:15, Rodolf, Arry, Bruxelles
    1987-11-06 14:30:00, Pazoni, Alfred, Gand
    1994-01-01 10:15:02, Blangean, Serge, Hasselt



    Mais j'aimerais obtenir:
    1984-15-04 14:13:15, Rodolf, Arry, Bruxelles
    1985-10-03 11:03:21, Petit, Jean, Marseille
    1986-10-11 22:02:51, Durant, Jacques, Paris
    1987-13-06 14:30:00, Pazoni, Alfred, Gand
    1994-01-01 10:15:02, Blangean, Serge, Hasselt
    1995-02-03 11:11:11, Fort, Miguel, Nancy

    comment puis-je trier directement tableau_resultat via les dates ?


    merci d'avance de votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Tu peux créer un second tableau indexé dans l'ordre du premier [edit]en n'y mettant que les dates[/edit] et faire simplement un asort() dessus.
    Ensuite il ne te reste qu'à réordonner le tableau initial en parcourant les indices du second qui vient d'être trié.

    J'espère que c'est clair !

  3. #3
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    étant donné la structure de ton tableau (voir la discussion précédente), ce n'est pas array_multisort qu'il faut utiliser mais plutôt usort.

    En effet, array_multisort te permettrait de classer un tableau sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    array('dates' => array(1985-10-03 11:03:21, 1986-10-11 22:02:51, 1995-02-03 11:11:11),
        'noms' => array('nom1', 'nom2', 'nom3'))
    Mais pas un tableau comme tu as, présenté de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    array(0 => array('date' =>'1985-10-03 11:03:21', 'nom' => 'nom1'),
        1 => array('date' =>'1986-10-11 22:02:51', 'nom' => 'nom2'),
        2 => array('date' =>'1995-02-03 11:11:11', 'nom' => 'nom3'))
    Pour utiliser usort, il faut définir une fonction de rappel qui compare deux éléments de ton tableau, par exemple :

    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
    function cmp($a, $b)
    {
        if ($a['date'] == $b['date'])
        {
            return 0;
        }
        else if ($a['date'] < $b['date'])
        {
            return -1;
        else
        {
            return 1;
        }
    }
     
    usort($this->list, "cmp");

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    merci de ta réponse,

    j'ai fait juste remis les dates en timestamp car sinon, "01/01/1994" aurait été plus petit que "15/04/1984" ("01/" apparaît avant "15/")

    j'ai ce code:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    //je compare via  le timestamp
    private function cmp($a, $b)
    {
    		//revenir au format timestamp		
    		$DateHeure1 = explode(" ", $a['date'] );
    		$Date1=explode("-", $DateHeure1[0] );
    		$heure1=explode(":", $DateHeure1[1]);
    		$date1=mktime  ($heure1[0], $heure1[1], $heure1[2], $Date1[1], $Date1[2], $Date1[0]);
     
    		$DateHeure2 = explode(" ", $b['date'] );
    		$Date2=explode("-", $DateHeure2[0] );
    		$heure2=explode(":", $DateHeure2[1]);
    		$date2=mktime  ($heure2[0], $heure2[1], $heure2[2], $Date2[1], $Date2[2], $Date2[0]);
     
    		//$timestamp = mktime(heures, minutes, secondes, mois, jour, année); 
     
    	    if ($date1 == $date2)
    	    {
    	        return 0;
    	    }
    	    else if ($date1 < $date2)
    	    {
    	        return -1;
    	    }
    	    else
    	    {
    	        return 1;
    	    }
    }
     
     
    //je trie
    public function trierAction()
    {
       $ensembleArray = array_merge($array1, $array2); 
       usort($ensembleArray , "cmp");
       $result['list'] = $ensembleArray ;
    }
    et il me renvoie ce message:
    <b>Warning</b>: usort() [<a href='function.usort'>function.usort</a>]: Invalid comparison function.

    in <b>Controller.php</b> on line <b>211</b><br />

    le manuel php a l'air de dire que la syntaxe est bonne.
    Ca viendrait des données alors?

  5. #5
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    Ta fonction callback est la méthode d'un objet, et pas une fonction classique.

    Si je suis la doc php (http://www.php.net/manual/fr/languag...types.callback), il faut appeler ta fonction usort comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    usort($ensembleArray , array(this, 'cmp'));

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 45
    Points : 32
    Points
    32
    Par défaut
    ça fonctionne

    mais j'ai mit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    usort($ensembleArray , array('MaClasse', 'cmp'));
    merci ;-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 02/04/2007, 17h49
  2. [Tableaux] trier un tableau associatif
    Par cijez dans le forum Langage
    Réponses: 3
    Dernier message: 11/07/2006, 16h07
  3. [Tableaux] Trier un tableau [array]
    Par clemsouz dans le forum Langage
    Réponses: 2
    Dernier message: 15/05/2006, 13h33
  4. [Tableaux] Trier un tableau comme avec ORDER BY DESC
    Par Anduriel dans le forum Langage
    Réponses: 28
    Dernier message: 08/12/2005, 18h50
  5. Comment trier un tableau, et repérer les doublon?
    Par danje dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 18h45

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