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] array_multisort et les valeurs nulles


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut [Tableaux] array_multisort et les valeurs nulles
    Bonjour,

    j'ai un petit soucis ^^

    Voila, j'ai passé mon apres midi a remplir mon tableau et à l'afficher comme il le fallait. Seulement maintenant j'ai un probleme ...

    Le site propose des tournois, et j'ai une valeurs "seed" (autrement dit tete de série). Le probleme est que lorsque je fais mon array_multisort comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_multisort($seed, SORT_NUMERIC, $timestamp, SORT_ASC, $status_inscription, SORT_DESC, $nom_de_lequipe_minuscule, SORT_ASC, $tab);
    Et bien, il me donne en 1er lieu les personnes n'ayant pas de seed (cela reviendrait au meme que si j'avais un seed égal à "0". J'aimerais faire en sorte que ceux dont les valeurs sont nulles soient en dernier.

    J'ai déja vu plusieurs choses :
    - la premiere concernant une requete mysql "ORDER BY FIELD()', mais là je suis dans un array ... et non dans une requete.
    - la seconde concernant un .. "NULL LAST" et "NULL FIRST" mais j'en sais pas plus j'ai jamais reussi a comprendre ou ça marchait..

    Merci de m'éclairer !!

    Cordialement
    Dernière modification par julp ; 04/11/2008 à 13h06. Motif: Utilisez le bouton résolu en bas au lieu d'éditer le titre de la discussion

  2. #2
    Membre confirmé Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Points : 531
    Points
    531
    Par défaut
    Bonjour,

    Une idée : tu peux mettre dans un autre tableau les personnes dont le SEED est NULL (en utlisant array_filter), trier les tableaux et les concaténer après.

    Je ne voie rien de plus propore, mais je suis curieux de voir les autres réponses

    Gillou.

  3. #3
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonsoir,

    Perso je ferais la même chose que Gilou, je me prend rarement la tête sur des trucs comme ca :p

    Sinon as-tu essayé de caster tes seeds en integer pour voir ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_multisort((int) $seed, SORT_NUMERIC, $timestamp, SORT_ASC, $status_inscription, SORT_DESC, $nom_de_lequipe_minuscule, SORT_ASC, $tab);

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir !!

    Merci des réponses. Alors petite précision ... j'ai tout appris par moi meme, je code depuis 4 ans, mais je n'ai jamais fais détude d'info ou quoique ce soit :p donc en général, quand je ne sais pas faire quelque chose c'est que je n'y ai jamais touché xD

    J'ai tenté le (int) mais ça me met l'erreur que j'ai deja eu en essayant d'autres choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: array_multisort(): Argument #1 is expected to be an array or sorting flag that has not already been specified in c:\program files\easyphp1-8\www\base\modules\Tournoi\admin.php on line 1163
    Ton idée Gilou me parait sympatique. Je vois le fond et je le comprends. Néanmoins, pour le remettre dans le code ... "ouch". Là il est 2h du mat, je rentre chez moi, je ne vais donc pas m'y remettre ^^ Si je comprend bien, je fais 2 requetes différentes à la suite ... du genre la 1ere : WHERE seed isnotnull et juste apres le isnull.

    Je testerai ça et je vous redis !!

    En tout cas merci de l'idée ^^

  5. #5
    Membre confirmé Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Points : 531
    Points
    531
    Par défaut
    Bonjour,

    Ce code devrait fonctionner, avec une seul requète.

    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
     
    <?php
    $seed = array();
     
    $seed1['A'] = NULL;
    $seed1['B'] = 5;
    $seed1['C'] = 15;
    $seed1['D'] = NULL;
    $seed1['E'] = 7;
     
    $seed_uniquement_null  = array_filter ( $seed1, "est_null" );
    $seed_sans_null  = array_filter ( $seed1, "n_est_pas_null" );
     
    asort($seed_uniquement_null);
    asort($seed_sans_null);
     
    $seed2 = array_merge ( $seed_uniquement_null, $seed_sans_null);
     
    echo "<pre>";
    echo "<h1>AVANT le tri</h1>";
    print_r($seed1);
    echo "<h1>APRES le tri</h1>";
    print_r($seed2);
    echo "</pre>";
     
    function est_null($val) {
    	return is_null($val) ;
    }
    function n_est_pas_null($val) {
    	return !is_null($val) ;
    }
    ?>
    Gillou

  6. #6
    Invité
    Invité(e)
    Par défaut
    MErci pour ton code !!

    Il marche effectivement, mais pour l'adaptation ... ça merde (normal sinon ce serait trop beau :p)

    J'ai en fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$tab[]=array( 'seed'=>$seed, 'nom_equipe'=>$nom_equipe, 'status_inscription'=>$status_inscription, 'status_inscription_ecriture'=>$status_inscription_ecriture, 'nom_equipe_minuscule'=>$nom_equipe_minuscule, 'id_participant'=>$id_participant, 'id_equipe_ou_clan'=>$id_equipe_ou_clan,  'timestamp'=>$timestamp);

    Donc du coup en dessous j'ai mis ton code, les 2 functions mis ailleurs (testé avec ton code il fallait les mettre en dehors de ma fonction). Maintenant j'ai meme enlevé la fonction isnull, afin d'afficher que celles qui ont un seed ... Mais alors là je comprend pas ... il m'affiche tout !!! :o

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $seed_sans_null  = array_filter ( $tab, "n_est_pas_null" );
     
    asort($seed_sans_null);
     
    $tab2 = array_merge ($seed_sans_null);
     
    echo"<pre>";print_r($tab2);echo"</pre>";
    J'ai meme les valeurs nulles ... alors que j'ai bien c/c ta fonction qui marchait bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function n_est_pas_null($val) {
    	return !is_null($val) ;
    }
    [EDIT] :

    En fait mon probleme vient du fait que mon seed se trouve dans $tab[$i]['seed'] et non pas dans $tab['seed']

    Help ! xD

  7. #7
    Membre confirmé Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Points : 531
    Points
    531
    Par défaut
    D'abbord, array_merge, c'est pour fusionner 2 tableaux.
    Dans mon code c'était pour fusionner seed_sans_null, et sedd_uniquement_null.
    Ca n'a plus d'interet maintenant, mais le problème ne vient pas de la.

    Essaye d'appliquer array_filter sur le tableau seed d'origine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $seed  = array_filter ( $seed, "n_est_pas_null" );
    asort($seed);
     
    $tab=array( 'seed'=>$seed, 'nom_equipe'=>$nom_equipe, 'status_inscription'=>$status_inscription, 'status_inscription_ecriture'=>$status_inscription_ecriture, 'nom_equipe_minuscule'=>$nom_equipe_minuscule, 'id_participant'=>$id_participant, 'id_equipe_ou_clan'=>$id_equipe_ou_clan,  'timestamp'=>$timestamp);
    Gillou.

  8. #8
    Invité
    Invité(e)
    Par défaut
    j'ai envie de dire "Aie" car si j'ai bien compris, il faudrait dans ce cas je le fasse dans la requete Mysql (car c'est à chaque occurence de ma requete While que j'incrémente mon tableau).

    Si c'est le cas, il faudrait que je repasse par le ORDER BY FIELD ??

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je pense que je devrais faire une sorte de for($i=1;$i<=2;$i++) et là dedans quand c $i = 1 c'est les valeur non null (avec le order by field) et ensuite les valeurs nulles de la meme facon tu ne crois pas ?

  10. #10
    Membre confirmé Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Points : 531
    Points
    531
    Par défaut
    non.... rassure toi (je crois).

    pourquoi tu n'ajoutes pas WHERE seed IS NOT NULL dans la requete SQL ?

    Gillou

  11. #11
    Invité
    Invité(e)
    Par défaut
    mmm

    Oui en fait, je crois que je suis allé cherché bien loin ...

    Je vais faire mon for() et puis quand la valeur sera de 1, je mettrai isnotnull et quand elle sera de 2 ce sera null ....

    En fait si ça marche, j'ai pitié de moi xD

    Je tiens au courant

  12. #12
    Membre confirmé Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Points : 531
    Points
    531
    Par défaut
    je n'ai pas bien compris, mais il semble que tu ais trouvé une solution... et c'est ce qui compte.

    Gillou.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Oui en gros je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for($i=1;$i<=2;$i++){
     
        if($i==1){$seed=" AND seed IS NOT NULL";}
        elseif($i==2){$seed=" AND seed IS NULL";}
     
    	$select_des_participants=mysql_query("SELECT id, id_equipe_ou_clan, seed, status_inscription, timestamp FROM $nuked[prefix]"._tournoi_participants." WHERE id_tournoi='$id_tournoi' $seed ORDER BY seed, timestamp");
    Et en dessous j'incrémente mon $tab

    Ensuite, je crée 2 tab comme dans ton 1er exemple, car sinon il me remélange tout à la fin ... Je veux que mon tab1 soit seulement par seed, et mon tab 2 par nom_equipe (vu qu'il n'y a pas de seed). Donc une fois que mes tableaux sont rangés chacun de leur coté, je les regroupe comme tu me l'avais indiqué

    Je continue le test et je confirme que ça marche ^^

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bon effectivement ça marche ...

    Je viens de voir que j'ai dautres parametres qui me posent probleme mais je vais m'en occuper ...

    Le probleme c'est au niveau du moment :p car les joueurs doivent valider leur inscription, donc il faut également les ranger par validaiton etc ... mais ça je vais m'en occuper, le plus gros probleme est réglé !!

    Merci @ toi Gillou !!

  15. #15
    Invité
    Invité(e)
    Par défaut
    J'ai une toute derniere question ...

    J'ai mes 2 tableaux (liste principale et remplacants)... nommés $tab1 et $tab2.

    Comment dois-je faire pour afficher par exemple :

    "Si $liste == principale, alors on lance le foreach($tab1 as $value){"

    "Autrement si $liste = remplacants, alors on lance le foreach ($tab2 as $value){"


    Merci de l'info :p

    PS : je demande ça, car seule la requete diffère ... alors que le reste est identique, et je ne veux pas faire de limit (c a d pr les 64 1ers puis on les mets en remplacants)

  16. #16
    Membre confirmé Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Points : 531
    Points
    531
    Par défaut
    attention, il me semble que tu développes une usine à gaz pour un problème relativement simple.
    A trop vouloir centraliser, tu finis par avoir un truc très compliqué.

    Je n'arrive plus bien a te suivre.

    Ce genre de code est complexe, difficile à lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for($i=1;$i<=2;$i++){
      if($i==1){$seed=" AND seed IS NOT NULL";}
      elseif($i==2){$seed=" AND seed IS NULL";}
     
    $select_des_participants=mysql_query("SELECT id, id_equipe_ou_clan, seed, status_inscription, timestamp FROM $nuked[prefix]"._tournoi_participants." WHERE id_tournoi='$id_tournoi' $seed ORDER BY seed, timestamp");
    Pourquoi est ce que tu n'utlises pas plutôt 2 requètes séparées ?


    Concernant ton dernier post :
    "Principal" et "remplaçant", je suppose qu'on parle de joueur.
    Ils sont tous dans la même table ? avec un champ booleen 'principal' ?
    explique nous la structure, et ce que tu veux au final.

    Gillou.

  17. #17
    Invité
    Invité(e)
    Par défaut
    c tres compliqué :p
    En fait, jvais me débrouillé et doubler la requete pr le second tableau ... tant pis :p

    Merci quand meme !

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

Discussions similaires

  1. Les jointures... et les valeurs nulles !
    Par PJ_56 dans le forum SQL
    Réponses: 2
    Dernier message: 25/04/2006, 23h33
  2. [Excel] Ne pas tracer les valeurs nulles d'un graphe
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/02/2006, 19h00
  3. Réponses: 7
    Dernier message: 16/12/2005, 14h59
  4. order by sans les valeurs NULL
    Par pendragon509 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/10/2005, 12h31
  5. Comment gérer les valeur Nulles dans une requête ?
    Par sondo dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/03/2005, 11h02

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