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 :

string[] asort() classement par ordre alphabetique


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de zool.bzh
    Homme Profil pro
    peintre industriel
    Inscrit en
    Octobre 2023
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : peintre industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2023
    Messages : 169
    Par défaut string[] asort() classement par ordre alphabetique
    Bonjourà tous

    j'ai un flux xml dans array et j'aimerais savoire comment faire apparaître :

    A

    tous les noms commencant par A

    B

    Tous les noms commencant par B etc ...

    voci mon code :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
    for ($j=0; $j<=$perfCount; $j++) {
    	//	asort($screenRay);
        asort($screenRay);
    }
    foreach ($screenRay as $key) {
     
        $string = $key;
            if ($string[0] != $string[0]) {
                echo '<br/>'.$string[0].'<br/>';
     
            }
         echo $key;
        }
    ?>
    alors comment faire ?

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 348
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 348
    Billets dans le blog
    17
    Par défaut
    Tu ne donnes pas ta structure de données initiale et ni l'attendu, je reprends la suite de https://www.developpez.net/forums/d2.../#post12091197

    XML :

    <performertable>
    	<performer>
    		<id>2079050</id>
    		<screenname>NutaAlisson</screenname>
    		<picture0>https://img1.wlresources.com/photo/...</picture0>
    		<picture1>https://img1.wlresources.com/photo/...</picture0>
    		<picture2>https://img1.wlresources.com/photo/...</picture0>
    		<picture3>https://img1.wlresources.com/photo/...</picture0>
    		...
    	</performer>
    	...
    </performertable>
    Je considère que tu as un tableau $performers dont le nom est rangé dans screenname.

    Le plus simple est de procéder par étape et de créer un nouveau tableau $performers_index du style :

    [
        'A' => [
            [performerA1],
            [performerA2],
            ...
        ],
        'B' => [
            [performerB1],
            ...
        ],
        ...
    ]
    [ETAPE 1] Pour cela on crée l'index :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $performers_index = [];
    usort($performers, fn ($a, $b) => $a->screenname <=> $b->screenname); // Tri préalable par nom
    foreach ($performers as $performer) { // Indexation
        $first_letter = substr($performer->screenname, 0, 1); // Première lettre du screenname
        $performers_index[$first_letter][] = $performer; // Indexation
    }

    [ETAPE 2] Puis on exploite/affiche l'index :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    foreach ($performers_index as $first_letter => $performers) {
        echo "<h2>{$first_letter}</h2>";
        echo '<ul>';
        foreach ($performers as $performer) {
            echo "<li>{$performer->screenname}</li>";
        }
        echo '</ul>';
    }

    Je suis à peu près sûr que ça ne fonctionnera pas car je me base sur une autre discussion, à toi d'adapter
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre confirmé Avatar de zool.bzh
    Homme Profil pro
    peintre industriel
    Inscrit en
    Octobre 2023
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : peintre industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2023
    Messages : 169
    Par défaut
    Après multiples tests

    j'en arrive a ça
    Code php : 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
    <?php
     
    $url = 'mon_fichier.xml';
    $xml = simplexml_load_file($url);
    $performers_index = [];
    $performers = $xml -> performer; //<=========ce qu'il manquai
    usort($performers, fn ($a, $b) => $a->screenname <=> $b->screenname); // Tri préalable par nom
    foreach ($performers as $performer) { // Indexation
        $first_letter = substr($performer->screenname, 0, 1); // Première lettre du screenname
        $performers_index[$first_letter][] = $performer; // Indexation
     
     
    }
     
     
    foreach ($performers_index as $first_letter => $performers) {
        echo "<h2>{$first_letter}</h2>";
        echo '<ul>';
        foreach ($performers as $performer) {
            echo "<li>{$performer->screenname}</li>";
        }
        echo '</ul>';
    }
     
     
    ?>
    mon problème maintenant est que usort me donne :

    Fatal error: Uncaught TypeError: usort(): Argument #1 ($array) must be of type array, SimpleXMLElement given in /htdocs/search/index2.php:7 Stack trace: #0 /htdocs/search/index2.php(7): usort(Object(SimpleXMLElement), Object(Closure)) #1 {main} thrown in /htdocs/search/index2.php on line

    usort n'accepte pas la première variable : usort(Object(SimpleXMLElement) et je ne sais pas pourquoi n'y comment y remédié...

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 348
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 348
    Billets dans le blog
    17
    Par défaut
    C'est parce que tu tries directement sur les objets SimpleXMLElement.

    Il faut convertir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    usort($performers, fn ($a, $b) => (string)$a->screenname <=> (string)$b->screenname); // Tri préalable par nom
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Invité de passage
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2013
    Messages : 13
    Par défaut
    Citation Envoyé par zool.bzh Voir le message

    usort n'accepte pas la première variable : usort(Object(SimpleXMLElement) et je ne sais pas pourquoi n'y comment y remédié...
    Bonjour, as tu regardé la documentation de usort()? => https://www.php.net/usort
    Tu y verra dans la signature de la fonction que usort() prend un Array en premier paramètre pas un objet. Puisque cette fonction trie un tableau, pas un objet!!

    Citation Envoyé par zool.bzh Voir le message

    n'y comment y remédié...
    En créant un tableau d'objet ou en transforment les objets en tableau
    https://waytolearnx.com/2019/10/conv...ay-en-php.html

  6. #6
    Membre confirmé Avatar de zool.bzh
    Homme Profil pro
    peintre industriel
    Inscrit en
    Octobre 2023
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : peintre industriel
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2023
    Messages : 169
    Par défaut
    alors voila ce que j'ai fait avec votre aide :
    Code php : 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
    <?php
    $url = 'mon_flux_xml';
    $xml = simplexml_load_file($url);
    $performers_index = [];
    $performers = $xml -> performer; 
    $perf_ray = (array)$performers;
    $screen_name = $xml -> performer -> screenname;
    $screen_ray = (array)$screen_name;
    usort($perf_ray, fn ($a, $b) => $a = $screen_ray <=> $b = $screen_ray); // Tri préalable par nom
     
     
    foreach ($performers as $performer) { // Indexation
        $first_letter = substr($performer->screenname, 0, 1); // Première lettre du screenname
        $performers_index[$first_letter][] = $performer; // Indexation
    }
     
    foreach ($performers_index as $first_letter => $performers) {
        echo "<h2>{$first_letter}</h2>";
        echo '<ul>';
        foreach ($performers as $performer) {
            echo "<li>{$performer->screenname}</li>";
        }
        echo '</ul>';
    }
    ?>
    et c'est toujours dans le désordre

  7. #7
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 348
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 348
    Billets dans le blog
    17
    Par défaut
    Pas facile de concilier SimpleXML et le tri.

    Testé OK :

    Code PHP : 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
    <?php
     
    $url = '...';
     
    $xml = simplexml_load_file($url);
     
    // Pour le tri, on /transforme/ l'objet SimpleXML en simple tableau
    $performers = [];
    foreach ($xml->performer as $performer) {
        $performers[] = $performer;
    }
     
    // strnatcasecmp() pour mieux gérer les majuscules/minuscules
    usort($performers, fn ($a, $b) => strnatcasecmp($a->screenname, $b->screenname)); // Tri préalable par nom
     
    $performers_index = [];
    foreach ($performers as $performer) { // Indexation
        $first_letter = substr($performer->screenname, 0, 1); // Première lettre du screenname
        $performers_index[$first_letter][] = $performer; // Indexation
    }
     
    foreach ($performers_index as $first_letter => $performers) {
        echo "<h2>{$first_letter}</h2>\r\n";
        echo "<ul>\r\n";
        foreach ($performers as $performer) {
            echo "  <li>{$performer->screenname}</li>\r\n";
        }
        echo "</ul>\r\n";
    }
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

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

Discussions similaires

  1. [MySQL] Classement par ordre alphabétique et données de type SET
    Par JosephC dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/10/2014, 19h19
  2. Classement par ordre alphabétique ne fonctionne plus
    Par Alixam dans le forum Bibliographies - Index - Glossaires
    Réponses: 2
    Dernier message: 07/08/2012, 15h51
  3. classement par ordre alphabetique
    Par didierdg dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/02/2008, 10h48
  4. Classement par ordre alphabétique
    Par crovette51101 dans le forum Access
    Réponses: 5
    Dernier message: 20/12/2006, 14h13
  5. [SGBD] Classement par ordre alphabetique
    Par Ceubex dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 02/07/2006, 20h12

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