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 dans un tableau de variables


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut [Tableaux] tri dans un tableau de variables
    Bonjour,

    Je suis débutant en PHP et je suis sur un programme qui scrupte tous les fichiers xml contenus dans un dossier et qui extraits certaines de leur données (avec simplexml_load_file) pour les afficher à l'écran.

    j'affiche donc l'ensemble des données que j'extrait de ces fichiers ce cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    echo "<big>$segment</big>";
    echo "  "; <------ tabulation
    echo $commune[1];
    echo "  "; <------ tabulation
    echo "<i>$surtitre[1]</i>";
    echo "  ";<------ tabulation
    echo "<b><a href=$image target='_blank'>$surtitre3[1]</a></b>";
    echo '<br />';
    A l'écran j'ai des lignes de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Paris toto lalala blablabla
    Lyon roro titititi aaaaaaa
    Lille tutu tetete bbbbbbb
    J'aurais voulu classer les éléments dans l'ordre aplhabétique de cette
    manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Lille tutu tetete bbbbbbb
    Lyon roro titititi aaaaaaa
    Paris toto lalala blablbla
    suis-je obliger de passer par une base mysql ? ou puis-je faire mon classement à partir de tableaux ?

    Si oui, quelle est la syntaxe à suivre pour la manipulation des éléments dans le tableau


    Merci d'avance pour vos réponses !!

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Points : 1 504
    Points
    1 504
    Par défaut
    Une solution serait de placer toutes tes variables xml dans un tableau php avant de les afficher.

    Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $tab[][communes]=$communes[$i]
    $tab[][surtitre]=$surtitre[$i]
    En ensuit avant de parcourir ton tableau pour afficher, tu peux trier ton tableau avec usort() en php et l'afficher.

  3. #3
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 133
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    Pour réaliser ce tour, il faut pour cela faire usage de 2 boucles for imbriqué pour ensuite faire une condition et ainsi replacer chaque élément du tableau.

    Je vous donne un exemple à vous de le réadapter pour votre 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
     
    <?php
    $Tab[0]="toto";
    $Tab[1]="polo";
    $Tab[2]="john";
    $Tab[3]="marcel";
    $Tab[4]="Marc";
    $Tab[5]="brice";
     
     
    // Les boucles for imbriqué.
    for($I=0;$I<count($Tab);$I++)
    {
    	for($J=$I+1;$J<count($Tab);$J++)
    	{
    		// Ici le ucfirst sert à passer la première lettre en majuscule, sinon, c'est toujours la lettre en majuscule qui passe prioritaire sur la lettre miniscule.
    		if(ucfirst($Tab[$I])>ucfirst($Tab[$J]))
    		{
    			$PlusPetit = $Tab[$I];
    			$Tab[$I]=$Tab[$J];
    			$Tab[$J]=$PlusPetit;
    		}
    	}
    }
    foreach($Tab as $value)
    	echo $value."<br/>";
    ?>
    Adit : Ah ba je connaissais pas cette fonction usort, merci.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    j'ai essayé avec la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $tab[][communes]=$communes[$i]
    mais je rencontre un pb avec le usort , je n'arrive pas à trouver la syntaxe exacte !!

    Si quelqu'un pouvait m'aider !!! merci par avance !

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Quel est le lien avec SimpleXML ? Il est normalement assez simple de trier les éléments avant exploitation de ceux-ci en passant en effet par un tableau et la fonction usort (un exemple récent : [SimpleXML] Ajouter un noeud dans un xml).

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    Les données que je dois exploiter ne sont pas dans 1 xml , mais dans une centaine de fichiers xml.
    Je fais donc une boucle while sur tous les fichiers xml contenus dans le dossier pour récupérer l'attribut "segment" .
    Et ce n'est qu'après que je voudrais classer cet Attribut par ordre alphabétique
    (comme cité plus haut).

    ça a l'air assez simple avec 1 seul fichier xml contenant les différentes valeurs d'attributs mais comparer 1 attribut contenu dans une centaine de fichiers ?!?
    je demande de l'aide.

    Je n'ai pas le code sous la main, je te le montrerais ces prochains jours.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    En effet, ce n'est donc pas applicable. Je vais dans le sens de la proposition de Raideman qui doit donner quelque chose de semblable à :
    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
    <?php
    function my_sort($t1, $t2) {
        return strcmp($t1['segment'], $t2['segment']);
    }
     
    $tab = array();
    $chemin = realpath('.') . DIRECTORY_SEPARATOR;
    $dir = opendir($chemin);
    while (($fic = readdir($dir) !== FALSE) {
        if (preg_match('~\.xml$~i', $fic)) {
            $sxml = simplexml_load_file($chemin . $fic);
            foreach ($sxml->myelement as $elt) {
                array_push($tab, array('segment' => utf8_decode($elt['segment']), 'val' => (string) utf8_decode($elt)));
            }
        }
    }
    closedir($dir);
     
    usort($tab, 'my_sort');
    foreach ($tab as $sstab) {
        printf('%s : %s<br />', $sstab['segment'], $sstab['val']);
    }
    (non testé)

    Par contre il faut voir ce que ça donne en temps d'exécution et mémoire consommée.

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    bonjour,

    J'ai essayé d'intégrer le code sans résultat ?!? Peut-être que je me suis trompé dans la syntaxe .

    Voici le code entier que j'utilise pour extraire les données, je voudrais savoir ou intégrer la fonction strcmp et ou placer le usort pour pouvoir trier sur la données "Segment":

    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
    40
    41
    42
    43
    44
     
    <?php
     
    $handle = opendir('.');
     
     
    while(false !== ($file = readdir($handle))) {
        if($file != "." && $file != "..") {
     
     
    $path = '.'.'/'.$file;
     
    if (preg_match('~\T.xml$~',$file)) {
     
    $sxml = simplexml_load_file($path);
    $segment = utf8_decode($sxml->Proprietes->Segment);
    $contenu = utf8_decode($sxml->Contenu);
     
     
    $image = substr_replace("$file","BR.jpg",7,7);
     
    $contenu = str_replace('?',"'",$contenu);
     
     
    echo "<big>$segment</big>";
    echo "	";
    echo $commune[1];
    echo "	";
    echo "<i>$surtitre[1]</i>"; 
    echo "	";
    echo "<b><a href=$image target='_blank'>$surtitre3[1]</a></b>"; 
    echo '<br />';
     
     
    }
    }
     
    }
     
     
    closedir($handle); 
     
     
    ?>
    Merci de m'éclairer sur le tri en question

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    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
    <?php
    function my_sort($t1, $t2) {
        return strcmp($t1['segment'], $t2['segment']);
    }
     
    $chemin = realpath('.') . DIRECTORY_SEPARATOR; // open_basedir compliant
    $tab = array();
     
    $handle = opendir($chemin);
    while (false !== ($file = readdir($handle))) {
        if ($file != '.' && $file != '..') {
            if (preg_match('~\T.xml$~', $file)) {
                $sxml = simplexml_load_file($chemin . $file);
                array_push($tab,
                    array(
                        'segment' => utf8_decode($sxml->Proprietes->Segment),
                        'contenu' => str_replace('?', "'", utf8_decode($sxml->Contenu)),
                        'image' => substr_replace($file, 'BR.jpg', 7, 7)
                    )
                );
            }
        }
    }
    closedir($handle);
     
    usort($tab, 'my_sort');
     
    foreach ($tab as $sstab) {
        echo '<big>' . $sstab['segment'] . '</big>';
    }
    (non testé)

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    Merci Julp , ça a l'air de fonctionner ! et les temps sont satisfaisants ! cool !

    Juste une dernière question :

    dans mon tableau, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                  ...
                        'surtitre3' => $surtitre3[1],
                        'image' => substr_replace($file, 'BR.jpg', 7, 7)
    je voudrais avoir une ligne du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo "<b><a ref=$sstab['image']target='_blank'>$sstab['surtitre3']</a></b>";
    Peux-tu me dire ce qui ne va pas dans cette ligne !

    Merci encore pour ce que vous faites

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par astrolane
    Peux-tu me dire ce qui ne va pas dans cette ligne !
    Si encore on savait un minimum "ce qui ne va pas" Un problème d'interpolation je présume ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "<b><a ref={$sstab['image']} target='_blank'>{$sstab['surtitre3']}</a></b>";
    Ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<b><a ref=' . $sstab['image'] . 'target="_blank">' . $sstab['surtitre3'] . '</a></b>';
    Et on peut aussi utiliser les fonctions à sortie formatée (printf).

  12. #12
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    ça fonctionne bien pour le gras mais pas pour le <a ref > , pas de souligné ni de liens dessus .. encore un petit coup de main STP !!!!

    Merci encore

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    excuse moi de t'avoir dérangé pour rien , tout es t OK

    Encore mille mercis !!!!

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

Discussions similaires

  1. [Tableaux] question recherche et tri dans un tableau
    Par nicopoal dans le forum Langage
    Réponses: 7
    Dernier message: 25/01/2007, 16h41
  2. [Tableaux] Tri dans un tableau
    Par ssebuser dans le forum Langage
    Réponses: 11
    Dernier message: 12/12/2006, 20h29
  3. Réponses: 7
    Dernier message: 10/03/2006, 19h09
  4. Faire une recherche de texte dans un tableau de variable
    Par alexxx69 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/02/2006, 13h12
  5. [Tableaux] Count dans un tableau
    Par krfa1 dans le forum Langage
    Réponses: 2
    Dernier message: 27/11/2005, 20h15

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