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 array sur autre chose que la clef sans boucler le tout


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut Trier array sur autre chose que la clef sans boucler le tout
    Bonjour,

    J'ai un array_users de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Array ( 
    	[1] => Array ( [id_user] => 22 [nom_user] => 'dédé') 
    	[2] => Array ( [id_user] => 7 [nom_user] => 'Joe') 
    	[3] => Array ( [id_user] => 10 [nom_user] => 'Atchoum' )
    )
    Et je souhaiterais le trier sur 'nom_user'.
    Alors j'ai cherché dans php manual, il est proposé de faire une boucle
    aussi, je souhaiterais éviter la boucle car
    - array_users est volumineux
    - le tri se passe lors d'une requête ajax
    - et ensuite l'affichage est rechargé avec
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    $("#list_users").load("test.php #list_users");
    > J'ai remarqué le .load est lancé avant de finir la requête ajax.


    > Existe-il une fonction php du style ?
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $index_a_trier='nom_user';
    sort($array_a_trier, $index_a_trier, ASC);

  2. #2
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Salut,

    Il existe un fonction native PHP qui permet de le faire avec un callback
    https://www.php.net/manual/fr/function.uasort.php

    Mais, pourquoi ne pas faire un ORDER BY sur ta requête SQL et ainsi récupérer ton tableau déjà ordonné ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Salut, merci de la réponse
    Mais, pourquoi ne pas faire un sort by sur ta requête SQL et ainsi récupérer ton tableau déjà ordonné ?
    Comme array_users est volumineux,
    je souhaiterais éviter de tout re-lister avec une boucle.

    Il existe un fonction native PHP qui permet de le faire avec un callback
    https://www.php.net/manual/fr/function.uasort.php
    function.uasort.php > L'exemple se passe sur des valeur numériques
    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
    <?php
    // Fonction de comparaison
    function cmp($a, $b) {
        if ($a == $b) {
            return 0;
        }
        return ($a < $b) ? -1 : 1;
    }
     
    // Tableau à trier
    $array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
    print_r($array);
     
    // Trie et affiche le tableau résultant
    uasort($array, 'cmp');
    print_r($array);
    ?>
    Comment faire avec des strings ?

  4. #4
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Malheureusement, sans boucler sur ton tableau, tu ne pourras pas "arranger" les données.

    Comment est généré ton tableau ?
    J'imagine qu'il provient du résultat d'une requête sql, si c'est le cas, tu devrais ajouter l'instruction ORDER BY dans ta requête pour recevoir les données déjà triées.

    Quelle est la taille du tableau ? Combien d'enregistrements ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 257
    Par défaut
    Salut,
    Oui mon tableau provient d'une requête sql et existe en variable de session ($_SESSION['array_users'])
    (comme ça j'évite de refaire une requête sql à chaque chargement de nouvelle page).
    et j'ai déjà ajouté ORDER BY dans pour trier les données.

    Pour ma question, c'était ordonner le tableau sur l'index 'nom_user' du tableau
    car il y 800 enregistrements

    Pour l'instant j'ai appliqué ta solution
    > refaire le tableau suite à l'insertion sql (faite en ajax)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    en appliquant la méthode indiquée ici et adaptée à ton array :

    Tri alphabétique (ASC) sur le "nom_user" :
    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
    <?php
    function cmp_nom_asc($a, $b) {
        if($a['nom_user'] == $b['nom_user']) { return 0; }
        return ($a['nom_user'] < $b['nom_user']) ? -1 : 1;
    }
     
    $arr = array(
        array("id_user" => "12", "nom_user" => "Camille"),
        array("id_user" => "5", "nom_user" => "André"),
        array("id_user" => "53", "nom_user" => "Emilie"),
        array("id_user" => "7", "nom_user" => "Didier"),
        array("id_user" => "34", "nom_user" => "Bernard"),
    );
    var_dump($arr);
     
    uasort($arr, 'cmp_nom_asc');
    var_dump($arr);
    ?>
    N.B. Pour le tri dans l'ordre inverse (DESC) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function cmp_nom_desc($a, $b) {
        if($a['nom_user'] == $b['nom_user']) { return 0; }
        return ($a['nom_user'] > $b['nom_user']) ? -1 : 1;
    }
    [EDIT] Par contre, ça ne fonctionne pas correctement avec les lettres accentuées.
    Même avec strcmp() ou strcasecmp().

    Une solution : remplacer les lettres accentués dans la fonction de comparaison
    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
    45
    46
    47
    <?php
    function minusculesSansAccents($texte)
    {
        $texte = mb_strtolower($texte, 'UTF-8');
        $texte = str_replace(
            array(
                'à', 'â', 'ä', 'á', 'ã', 'å',
                'î', 'ï', 'ì', 'í', 
                'ô', 'ö', 'ò', 'ó', 'õ', 'ø', 
                'ù', 'û', 'ü', 'ú', 
                'é', 'è', 'ê', 'ë', 
                'ç', 'ÿ', 'ñ', 
            ),
            array(
                'a', 'a', 'a', 'a', 'a', 'a', 
                'i', 'i', 'i', 'i', 
                'o', 'o', 'o', 'o', 'o', 'o', 
                'u', 'u', 'u', 'u', 
                'e', 'e', 'e', 'e', 
                'c', 'y', 'n', 
            ),
            $texte
        );
     
        return $texte;        
    }
    function cmp_nom_asc($a, $b) {
    	$var1 = minusculesSansAccents($a['nom_user']);
    	$var2 = minusculesSansAccents($b['nom_user']);
        if(strcasecmp($var1,$var2)==0) { return 0; }
        return (strcasecmp($var1,$var2)<0) ? -1 : 1;
    }
     
     
    $arr = array(
        array("id_user" => "12", "nom_user" => "Camille"),
        array("id_user" => "5", "nom_user" => "ändré"),
        array("id_user" => "53", "nom_user" => "émilie"),
        array("id_user" => "7", "nom_user" => "Didier"),
        array("id_user" => "34", "nom_user" => "Bernard"),
    );
    var_dump($arr);
     
    uasort($arr, 'cmp_nom_asc');
    var_dump($arr);
     
    ?>
    Dernière modification par Invité ; 28/11/2019 à 16h04.

  7. #7
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    J'ai du mal à comprendre l'utilité de stocker autant d'informations dans la session.
    J'imagine que tu n'as pas de montée en charge sur ton serveur web.

    J'espère que tu remets à jour ta session lorsque tu supprimes ou ajoutes un user dans ta base de données, sans ça, les informations stockées sont fausses :-)

    Enfin, tu sais ce que tu as à faire.

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Pour trier par rapport a des chaines, il faut utiliser une fonction de comparaison de chaines; Par exemple strcmp ou si tu veux vraiment un truc précis qui gère les locales (notamment les accents en français) Collator::compare
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

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

Discussions similaires

  1. SSMS - Designer inopérant sur autre chose que DBO
    Par Bluedeep dans le forum Outils
    Réponses: 3
    Dernier message: 04/12/2012, 14h58
  2. JFileChooser et filtre sur autre chose que l'extension.
    Par Djobird dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 19/03/2007, 16h19
  3. Arrive plus a installer autre chose que debian
    Par kosmic dans le forum Debian
    Réponses: 10
    Dernier message: 12/12/2005, 11h50
  4. [langage] connaissez-vous autre chose que -d
    Par Sébastien dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 20h13

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