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 :

Trier un tableau contenant des chaines sur un élément de la chaine


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut Trier un tableau contenant des chaines sur un élément de la chaine
    Bonjour à tous,

    Pas sur que mon titre soit très clair. Je m'explique.

    Je viens lire un fichier .txt en php et je range chaque ligne du fichier dans un tableau. Toutes les lignes sont formatées de la même manière.

    Article1;Description;Prix;Frais

    Je créé ensuite un nouveau tableau dans lequel je range chaque élément de la chaine.

    Voici le code que j'utilise pour lire le fichier puis ranger les différentes valeurs dans un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $tabfich=file($fichier); 
    sort($tabfich);
    for( $i = 0 ; $i < count($tabfich) ; $i++ )
    {
    $element=explode(";", $tabfich[$i]);
    //affichage des différentes valeurs de chaque ligne du fichier txt
    }
    Le problème de cela c'est que mes lignes du fichier txt sont traitées dans l'ordre dans lesquels elles apparaissent dans le fichier txt. Or je voudrais les classer par prix croissant avant d'afficher les différents éléments qui les composent.

    Comment puis-je faire ?

    En vous remerciant d'avance

  2. #2
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    tu as déjà entendu parler des tables de hachages ? bon alors un systeme similaire: un conteneur dont la clé est le prix et qui contient l'ensemble des article à ce prix.

    bref
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //$conteneur[$prix][]=explode(';', $tabfich[$i],4);
    $tmp = explode(';', $tabfich[$i],4);
    $conteneur[$tmp[2]][]=tmp; //éventuellement un clone ici... parfois je doute...
    mais bon, à l'école tu aurais appris une solution du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $conteneur[]= explode(";", $tabfich[$i]);
    //---
    function trierElement(&$t1,&$t2){
    return $t1[2]-$t2[2];
    }
    usort($conteneur, 'trierElement');

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut
    Merci pour ta réponse. Je débute en PHP par contre. Comment ensuite je peux afficher les valeurs contenues dans le conteneur ?

    Actuellement mon code est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $tabfich=file($fichier); 
    for( $i = 0 ; $i < count($tabfich) ; $i++ )
    {
    $element=explode(";", $tabfich[$i]);
     
    echo "<TR>";
    echo "<TH>".$element[0]."</TH>";
    echo "<TH>".$element[1]."</TH>";
    echo "<TH>".$element[2]."</TH>";
    echo "<TH>".$element[3]."</TH>";
    echo "</TR>";
    Bien sur le problème c'est que élément n'est pas trié

  4. #4
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 60
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Juste une remarque Vynalis.
    Es-tu conscient que tu as un fichier à plat, du genre csv, et que tu voudrais faire un travail de tri, qui serait bien plus facile avec une petite base de données mysql ?

    Mais mettons que tu ne peux pas/dois pas utiliser une base de données.

    Tu voudrais donc à partir d'un fichier csv construire un tableau php, une variable, et à partir de cette variable php, trier sur un champ, et ensuite afficher tout cela en HTML.

    C'est faisable.

    Pour faire un tableau php, tableau associatif de préférence, tu auras une syntaxe dans ce goût :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $monTableau=array();
    foreach($fichier as $ligneFichier){
    $ligneTableau=array('champ1'=>$ligneFichier[0],'champ2'=>$ligneFichier[1]);
    array_push($monTableau,$ligneTableau);
    }
    Maintenant tu possèdes un tableau associatif en php.
    Pour le trier ensuite : la fonction array_multisort (qui trie un tableau suivant des clés)

    http://php.net/manual/fr/function.array-multisort.php
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  5. #5
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 60
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Un petit exemple vaut mieux qu'un long discours

    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
    $tableau=array();
    $ligne1=array('age'=>17,'nom'=>'DUPONT','prenom'=>'Gaston');
    $ligne2=array('age'=>19,'nom'=>'AVION','prenom'=>'Henriette');
    array_push($tableau,$ligne1);
    array_push($tableau,$ligne2);
     
    //On va avoir besoin d'une liste de colonnes pour trier par champ
    foreach ($tableau as $key => $row) {
        $age[$key]  = $row['age'];
        $nom[$key] = $row['nom'];
    	$prenom[$key] = $row['prenom'];
    }
    //ici, tu peux jouer avec le champ et le type du tri
    array_multisort($age, SORT_ASC, $tableau);
    echo '<pre>';
    print_r($tableau);
    echo '</pre>';
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut
    Merci pour ton aide mais je n'arrive toujours pas à faire ce que je veux. En fait si j'utilise un fichier csv c'est que je ne peux pas utiliser de bdd sinon je l'aurais fait comme ça et je me prendrai moins la tête

    J'ai bien compris le tri du tableau ça pas de souci mais ce que je n'arrive pas c'est à remplir le tableau initial avec les valeurs que je veux.

    Si on le remplit manuellement comme tu me montre c'est effectivement très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $tableau=array();
    $ligne1=array('age'=>17,'nom'=>'DUPONT','prenom'=>'Gaston');
    $ligne2=array('age'=>19,'nom'=>'AVION','prenom'=>'Henriette');
    array_push($tableau,$ligne1);
    array_push($tableau,$ligne2);
    Le problème c'est que moi j'ai un tableau $tabfich qui contient dans chaque case une ligne du fichier. Cette ligne est une chaine de caractères de type :

    Article1;Description;Prix;Frais

    Je n'ai pas l'impression que la fonction explode me permettre de récupérer un élément donné de la chaine.

    En fait il faudrait qu'au final j'ai quelque chose comme ça mais je n'y arrive pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $tableautri=array();
    foreach($tabfich as $ligneFichier){
    $ligneTableau=array('Nomarticle'=>texte avant le premier ;,'description'=>texte après le premier ; et avant le 2eme,'prix'=>texte entre le 2eme et le 3eme;,'frais'=>texte après le 3eme ;);
    array_push($tableautri,$ligneTableau);
    $j++;
    }

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/06/2015, 22h31
  2. Réponses: 3
    Dernier message: 05/09/2014, 23h42
  3. Tri sur plusieurs champs d'un tableau contenant des objets
    Par swampsnake dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/07/2011, 14h14
  4. Trier un tableau contenant des hash
    Par kioka dans le forum Langage
    Réponses: 18
    Dernier message: 30/04/2009, 17h28
  5. Réponses: 7
    Dernier message: 10/06/2008, 16h38

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