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

  1. #1
    Membre régulier
    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
    Points : 97
    Points
    97
    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);
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  2. #2
    Membre confirmé 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
    Points : 492
    Points
    492
    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 régulier
    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
    Points : 97
    Points
    97
    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 ?
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  4. #4
    Membre confirmé 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
    Points : 492
    Points
    492
    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 régulier
    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
    Points : 97
    Points
    97
    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)
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  6. #6
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    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]

  7. #7
    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.

  8. #8
    Membre confirmé 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
    Points : 492
    Points
    492
    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.

  9. #9
    Membre régulier
    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
    Points : 97
    Points
    97
    Par défaut
    Ok merci Célira et jreaux62.

    #ma5t3r
    L'utilité de stocker autant d'informations dans la session
    serait d'éviter de faire des requêtes sql à chaque chargement de pages.

    Par exemple j'ai une liste de régions, je les mets en session (avec id et nom_region) et je peux les réutiliser par exemple dans les <select>

    Est-ce que c'est plus léger que de refaire des requêtes à chaque fois ?
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    l'approche est mauvaise, si tu veux réduire sensiblement les données en session et le requêtes SQL, je t'invite à te pencher sur la possibilité d'utiliser un gestionnaire de cache, ou carrément un système de fichiers texte qui feraient la blague.

  11. #11
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Je plussoie @rawsrc, il te faut simplement du cache plutôt que de bourrer une session.
    D'autant que la session est propre à chaque utilisateur, donc si t'as 2000 personnes qui se connectent au site en même temps, tu vas quand même faire 2000 fois cette requête que tu ne souhaites pas faire.

    Par contre, il ne faut pas croire que SQL est "faible" et qu'il est difficile pour lui de récupérer -admettons- 200 lignes.
    Si les index sont bien mis, ça va très vite et dans ce cas, un système de cache sera plus lourd que d'exécuter les requêtes à chaque chargement. D'autant que SQL vient avec son propre système de cache qui fait que s'il exécute 2 fois la même requête, c'est encore plus rapide !

  12. #12
    Membre régulier
    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
    Points : 97
    Points
    97
    Par défaut
    Ok,
    il ne faut pas croire que SQL est "faible" et qu'il est difficile pour lui de récupérer -admettons- 200 lignes
    Ok,pour les users (800), je vais charger depuis la bd, sur la page qui en a besoin.

    je t'invite à te pencher sur la possibilité d'utiliser un gestionnaire de cache
    > l'idée serait du localStorage ?
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    array_region = <?php echo json_encode($_SESSION['array_region'])?>;
    	console.log(array_region);
    localStorage.setItem('array_region',JSON.stringify(array_region));
    	console.log(localStorage.getItem('array_region'));
    Ca c'est bien ca reste sur le client.
    Et comment récupérer cette array js pour créer un <select> par exemple ?
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  13. #13
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Ok,pour les users (800), je vais charger depuis la bd, sur la page qui en a besoin.
    Ce n'est pas vraiment comme ça qu'il faut résonner. Je t'invite à passer -par exemple- via PhpMyAdmin et à y introduire ta requête.
    De cette façon, tu auras la vitesse d'exécution.
    Le second point est de voir comment va évoluer cette requête dans le temps. Est-il possible qu'on passe de 800 à 8000 lignes en 1 mois, en 1 an ou en 10 ans ?
    De plus, est-ce que ces 800 résultats sont les mêmes pour tout le monde ou est-ce différent suivant l'utilisateur qui visite le site ?

    Beaucoup d'inconnues dans ton problème ici ^^

    Le cache dont nous parlons est un cache côté serveur, et non pas un localStorage qui est côté client.
    Si la requête est la même pour tout le monde, le cache doit être côté serveur (APC cache par exemple). En effet, que tu sauvegardes en localStorage ou en SESSION, le problème est toujours le même : pour tout nouvel utilisateur tu vas à nouveau exécuter cette requête. Alors, il est possible que ça soit nécessaire mais le contraire aussi !


    EDIT : Par contre, j'aimerais attirer ton regard sur la toute première réponse de @ma5t3r : pourquoi ne pas utiliser ORDER BY dans ta requête ?
    Tu dis que ton array est volumineux mais SQL gère mieux le tri que PHP, donc c'est SQL qui devrait le faire !

    Enfin, avec ta tonne de résultats (qui doivent ensuite aller dans un select) pourquoi ne pas faire un <input type="text"> (ou même un <select> avec jQuery Chosen) avec de l'autocomplete ?

  14. #14
    Membre confirmé 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
    Points : 492
    Points
    492
    Par défaut
    Tu as environ 9ko de données à récupérer.
    C'est quasiment instantané via une requête SQL.
    Je ne vois pas ce qui te perturbe autant.

  15. #15
    Membre régulier
    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
    Points : 97
    Points
    97
    Par défaut
    Bien,
    Je t'invite à passer -par exemple- via PhpMyAdmin et à y introduire ta requête.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM `users` ORDER BY `nom_user`
    // "Affichage des lignes 0 - 29 ( 857 total, Traitement en 0.0183 sec)"
    0.0183 sec, ça envoi. Je vais rester donc sur la requête mysql quand il y en a besoin.
    #ma5t3r, ouais j'avais la phobie de faire des requêtes redondantes, avec l'idée de tout stocker chez le client une bonne fois pour toute.



    est-ce que ces 800 résultats sont les mêmes pour tout le monde ou est-ce différent suivant l'utilisateur qui visite le site ?
    > Les visiteurs auront chacun leur base de données perso, donc la requête sera différente pour chacun.

    Pour, autocomplte, je fais:
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Suite à la requête MySql
    autocomp_users=<?php echo json_encode($autocomp_users);?>; // console.log(autocomp_users);
    localStorage.setItem('autocomp_users',JSON.stringify(autocomp_users));
     
    // puis dans JQuery: 
    $("#autocomp_users")
        .autocomplete({ 
         // Deux essais pour la source (pas en même temps): 
          source: JSON.parse(localStorage.getItem('autocomp_users')),  // Là ok 
            }
        });
    Avec <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

    jQuery Chosen est super, merci.
    Aussi je n'ai besoin que d'un select standard.
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  16. #16
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Bonjour,

    0.0183 sec, ça envoi. Je vais rester donc sur la requête mysql quand il y en a besoin.
    Ce temps, c'est celui qui est pris pour retourner 30 lignes et non 857 !

    Tu n'as pas compris le principe de l'autocomplete.
    Dans ton cas, c'est juste plus pratique pour les utilisateurs mais tu ne soulages pas ton serveur.

    Le principe d'autocomplete dont je voulais parler est que -de base- tu n'effectues AUCUNE requête.
    Ensuite, lorsque l'utilisateur commence à taper des lettres, tu commences à chercher ce qu'il tape et uniquement ce qui correspond à ce qu'il tape, histoire de ne pas avoir un résultat de 857 lignes.

  17. #17
    Membre régulier
    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
    Points : 97
    Points
    97
    Par défaut
    Ce temps, c'est celui qui est pris pour retourner 30 lignes et non 857 !
    Oups, pardon.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM `users` ORDER BY `nom_user` LIMIT 0 , 857"
    La première fois : Traitement en 2.7134 sec
    + "Une page web ralenti votre navigateur"
    La deuxième fois : Traitement en 0.0134 sec

    Le principe d'autocomplete dont je voulais parler est que -de base- tu n'effectues AUCUNE requête
    Ok, j'ai dézippé jQuery Chosen, apparement dans index.html, les infos (des pays) sont en dur (html).
    Donc pour mes users, il faut bien que j'en fasse la requête, non ?
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

  18. #18
    Membre confirmé 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
    Points : 492
    Points
    492
    Par défaut
    Pourquoi un select * si tu n'as besoin que de user_id et user nom ?
    Le select * impose une requête supplémentaire dans le schéma pour récupérer l'ensemble des noms de colonnes.

  19. #19
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Je t'ai créé un exemple ici : https://tests.pierre-roels.com/jquery-chosen/

    En réalité, j'ai utilisé select2 car c'est beaucoup plus facile pour faire de l'AJAX

    Voilà le code minimal html/JS :

    Code html : 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
    <select name="mon-select" data-placeholder="Choose a country..." class="form-control  ton-chosen-select">
                    </select>
     
    <link href="https://cdn.jsdelivr.net/npm/select2@4.0.12/dist/css/select2.min.css" rel="stylesheet" />
    <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/chosen/1.8.7/chosen.jquery.min.js"></script>
            <script src="https://cdn.jsdelivr.net/npm/select2@4.0.12/dist/js/select2.min.js"></script>
            <script>
                $(".ton-chosen-select").select2({
                    ajax: {
                        url: '/jquery-chosen/',
                        dataType: 'json',
                        delay: 0,
                        data: function (params) {
                            return {
                                q: params.term // search term
                            };
                        },
                        processResults: function (data) {
                            // parse the results into the format expected by Select2.
                            // since we are using custom formatting functions we do not need to
                            // alter the remote JSON data
                            return {
                                results: data
                            };
                        },
                        cache: false
                    },
                    minimumInputLength: 2
                });
            </script>


    Et côté serveur :
    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
    <?php
    $countries = array("Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", "Bosnia and Herzegowina", "Botswana", "Bouvet Island", "Brazil", "British Indian Ocean Territory", "Brunei Darussalam", "Bulgaria", "Burkina Faso", "Burundi", "Cambodia", "Cameroon", "Canada", "Cape Verde", "Cayman Islands", "Central African Republic", "Chad", "Chile", "China", "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Congo", "Congo, the Democratic Republic of the", "Cook Islands", "Costa Rica", "Cote d'Ivoire", "Croatia (Hrvatska)", "Cuba", "Cyprus", "Czech Republic", "Denmark", "Djibouti", "Dominica", "Dominican Republic", "East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia", "Ethiopia", "Falkland Islands (Malvinas)", "Faroe Islands", "Fiji", "Finland", "France", "France Metropolitan", "French Guiana", "French Polynesia", "French Southern Territories", "Gabon", "Gambia", "Georgia", "Germany", "Ghana", "Gibraltar", "Greece", "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guinea", "Guinea-Bissau", "Guyana", "Haiti", "Heard and Mc Donald Islands", "Holy See (Vatican City State)", "Honduras", "Hong Kong", "Hungary", "Iceland", "India", "Indonesia", "Iran (Islamic Republic of)", "Iraq", "Ireland", "Israel", "Italy", "Jamaica", "Japan", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Korea, Democratic People's Republic of", "Korea, Republic of", "Kuwait", "Kyrgyzstan", "Lao, People's Democratic Republic", "Latvia", "Lebanon", "Lesotho", "Liberia", "Libyan Arab Jamahiriya", "Liechtenstein", "Lithuania", "Luxembourg", "Macau", "Macedonia, The Former Yugoslav Republic of", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands", "Martinique", "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia, Federated States of", "Moldova, Republic of", "Monaco", "Mongolia", "Montserrat", "Morocco", "Mozambique", "Myanmar", "Namibia", "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island", "Northern Mariana Islands", "Norway", "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines", "Pitcairn", "Poland", "Portugal", "Puerto Rico", "Qatar", "Reunion", "Romania", "Russian Federation", "Rwanda", "Saint Kitts and Nevis", "Saint Lucia", "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Sao Tome and Principe", "Saudi Arabia", "Senegal", "Seychelles", "Sierra Leone", "Singapore", "Slovakia (Slovak Republic)", "Slovenia", "Solomon Islands", "Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "Spain", "Sri Lanka", "St. Helena", "St. Pierre and Miquelon", "Sudan", "Suriname", "Svalbard and Jan Mayen Islands", "Swaziland", "Sweden", "Switzerland", "Syrian Arab Republic", "Taiwan, Province of China", "Tajikistan", "Tanzania, United Republic of", "Thailand", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey", "Turkmenistan", "Turks and Caicos Islands", "Tuvalu", "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", "United States Minor Outlying Islands", "Uruguay", "Uzbekistan", "Vanuatu", "Venezuela", "Vietnam", "Virgin Islands (British)", "Virgin Islands (U.S.)", "Wallis and Futuna Islands", "Western Sahara", "Yemen", "Yugoslavia", "Zambia", "Zimbabwe");
    if (!empty($_GET['q'])) {
        $response = [];
        // Ici, à la place de boucler sur les pays et de faire un preg_match() de la requête
        // il faudra remplacer tout ça par ta requête
        // Quelque chose comme :
        // $sql = "SELECT user_id, nom_user FROM users WHERE nom_user LIKE '" . $_GET['q'] . "%' ORDER  BY nom_user";
        foreach ($countries AS $k => $v) {
            if (preg_match('#' . $_GET['q'] . '#i', $v)) {
                $response[] = [
                    'id' => $k,
                    'text' => $v,
                ];
            }
        }
        header('Content-Type: application/json');
        echo json_encode($response);
        exit;
    }
    ?>


    Et voilà mon code complet : https://pastebin.com/3jaBrqY4

  20. #20
    Membre régulier
    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
    Points : 97
    Points
    97
    Par défaut
    Citation Envoyé par ma5t3r Voir le message
    Pourquoi un select * si tu n'as besoin que de user_id et user nom ?
    Le select * impose une requête supplémentaire dans le schéma pour récupérer l'ensemble des noms de colonnes.
    C'était pour voir la vitesse
    "Ils ne savaient pas que c'était impossible, alors ils l'ont fait." Mark Twain

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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