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 :

[Debutant] Filtre et tri d'un array complexe [PHP 7]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2013
    Messages : 29
    Par défaut [Debutant] Filtre et tri d'un array complexe
    Salut,

    Désolé d'avance j'ai fait des recherches mais mon niveau en php n'est pas assez consistant pour mon besoin.

    Voici mon pb :

    J'ai besoin, pour plusieurs fonctions, de filtrer et/ou trier des données dans une extraction de base MSSQL dans un array. Un membre d'ici (pour des raisons de performance) m'a conseillé de créer un array global plutôt que de faire appel à des fonctions qui ne récupèrent que des bribes d'infos à chaque fois dans une bdd MSSQL. J'avoue que maintenant j'obtiens mes données en à peine 1sec au lieu d'une 10 aine avant. Cependant je m'aperçois que je ne comprends rien aux array et donc que je ne peux transposer ceci à mes fonctions d'affichage des données.

    J'ai un array qui liste l'intégralité des tâches de la semaine avec toutes les infos dont j'ai besoin pour ensuite les afficher sous forme de planning dans un "tableau" mais je bloque à la 1ère ligne ou je dois faire la liste du personnel vu que chaque personne (qui peut forcément avoir plusieurs tâches par semaine) apparait plusieurs fois dans l'array.

    J'ai donc un tableau de ce style (j'ai extrait que la partie qui m'intéresse) :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
      'Prenom' => 
        array (size=58)
          0 => string 'Alexis' (length=6)
          1 => string 'Alexis' (length=6)
          2 => string 'Davy' (length=4)
          3 => string 'Davy' (length=4)
          4 => string 'Davy' (length=4)
          5 => string 'Hugues' (length=6)
          6 => string 'Joachim' (length=7)
          7 => string 'Pascal' (length=6)
          8 => string 'Pascal' (length=6)
          9 => string 'Pascal' (length=6)
          10 => string 'Pascal' (length=6)
          11 => string 'Marc' (length=4)
          12 => string 'Marc' (length=4)
          13 => string 'Olivier' (length=7)
          14 => string 'Olivier' (length=7)
          15 => string 'Olivier' (length=7)
          16 => string 'Olivier' (length=7)
          17 => string 'Olivier' (length=7)
          18 => string 'Olivier' (length=7)
          19 => string 'Olivier' (length=7)
          20 => string 'Olivier' (length=7)
          21 => string 'Pascal' (length=6)
          22 => string 'Pascal' (length=6)
          23 => string 'Pascal' (length=6)
          24 => string 'Pascal' (length=6)
          25 => string 'Pascal' (length=6)
          26 => string 'Pascal' (length=6)
          27 => string 'Pascal' (length=6)
          28 => string 'Sébastien' (length=10)
          29 => string 'Sébastien' (length=10)
          30 => string 'Sébastien' (length=10)
          31 => string 'Sébastien' (length=10)
          32 => string 'Sébastien' (length=10)
          33 => string 'Sébastien' (length=10)
          34 => string 'Sébastien' (length=10)
          35 => string 'Vincent' (length=7)
          36 => string 'Vincent' (length=7)
          37 => string 'Vincent' (length=7)
          38 => string 'Vincent' (length=7)
          39 => string 'Vincent' (length=7)
          40 => string 'Vincent' (length=7)
          41 => string 'Vincent' (length=7)
          42 => string 'Vincent' (length=7)
          43 => string 'Jean Luc' (length=8)
          44 => string 'Jean Luc' (length=8)
          45 => string 'Jean Luc' (length=8)
          46 => string 'Jean Luc' (length=8)
          47 => string 'Jean Luc' (length=8)
          48 => string 'Jean Luc' (length=8)
          49 => string 'Antoine' (length=7)
          50 => string 'Gino' (length=4)
          51 => string 'Gino' (length=4)
          52 => string 'Gino' (length=4)
          53 => string 'Gino' (length=4)
          54 => string 'Philippe' (length=8)
          55 => string 'Philippe' (length=8)
          56 => string 'Philippe' (length=8)
          57 => string 'Philippe' (length=8)
      'UserId' => 
        array (size=58)
          0 => string '434' (length=3)
          1 => string '434' (length=3)
          2 => string '402' (length=3)
          3 => string '402' (length=3)
          4 => string '402' (length=3)
          5 => string '63' (length=2)
          6 => string '271' (length=3)
          7 => string '77' (length=2)
          8 => string '77' (length=2)
          9 => string '77' (length=2)
          10 => string '77' (length=2)
          11 => string '207' (length=3)
          12 => string '207' (length=3)
          13 => string '51' (length=2)
          14 => string '51' (length=2)
          15 => string '51' (length=2)
          16 => string '51' (length=2)
          17 => string '51' (length=2)
          18 => string '51' (length=2)
          19 => string '51' (length=2)
          20 => string '51' (length=2)
          21 => string '206' (length=3)
          22 => string '206' (length=3)
          23 => string '206' (length=3)
          24 => string '206' (length=3)
          25 => string '206' (length=3)
          26 => string '206' (length=3)
          27 => string '206' (length=3)
          28 => string '59' (length=2)
          29 => string '59' (length=2)
          30 => string '59' (length=2)
          31 => string '59' (length=2)
          32 => string '59' (length=2)
          33 => string '59' (length=2)
          34 => string '59' (length=2)
          35 => string '61' (length=2)
          36 => string '61' (length=2)
          37 => string '61' (length=2)
          38 => string '61' (length=2)
          39 => string '61' (length=2)
          40 => string '61' (length=2)
          41 => string '61' (length=2)
          42 => string '61' (length=2)
          43 => string '62' (length=2)
          44 => string '62' (length=2)
          45 => string '62' (length=2)
          46 => string '62' (length=2)
          47 => string '62' (length=2)
          48 => string '62' (length=2)
          49 => string '272' (length=3)
          50 => string '183' (length=3)
          51 => string '183' (length=3)
          52 => string '183' (length=3)
          53 => string '183' (length=3)
          54 => string '93' (length=2)
          55 => string '93' (length=2)
          56 => string '93' (length=2)
          57 => string '93' (length=2)
    Dont je souhaiterais lister une seule fois le Nom, Prenom et UserId de chaque personne

    j'ai tenté plein de trucs mais je n'y comprend rien

    Une âme charitable pour m'expliquer ou m'aiguiller vers un tuto ou un cours qui en parle ?

    Merci de m'avoir lu
    iLtG

  2. #2
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Hello,

    C'est moi qui avais conseillé de limiter le nombre de requêtes ^^

    En fait, le tableau qui est là n'a pas de valeur en l'état. Il est même très étrange car on a des lignes avec tous les prénoms et puis tous les IDs.
    Habituellement, on reçoit une information complète de la DB par ligne, c'est à dire Ligne 1 : Prénom 1 - Id 1; Ligne 2 : Prénom 2 - Id 2; etc

    Quand j'avais proposé de créer un tableau de données, il s'agissait d'un tableau de données ordonnées.
    C'est à dire qu'on récupèrerait en amont les dates (en plus des prénoms); il suffit ensuite de boucler sur les données pour les ordonnées par date => user

    Un tableau qui ressemblerait à :

    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
     
    [2021-09-06] => [
          [userID-1] => [
                  [détails de la tache 1],
                  [détails de la tache 2],
          ],
          [userID-2] => [
                  [détails de la tache 2-1],
                  [détails de la tache 2-2],
          ],
          [userID-3] => [
                  [détails de la tache 3-1],
                  [détails de la tache 3-2],
          ],
    ],
    [2021-09-07] => [
          [userID-1] => [
                  [détails de la tache 1],
                  [détails de la tache 2],
          ],
          [userID-2] => [
                  [détails de la tache 2-1],
                  [détails de la tache 2-2],
          ],
          [userID-3] => [
                  [détails de la tache 3-1],
                  [détails de la tache 3-2],
          ],
    ],
    [2021-09-08] => [
          [userID-1] => [
                  [détails de la tache 1],
                  [détails de la tache 2],
          ],
          [userID-2] => [
                  [détails de la tache 2-1],
                  [détails de la tache 2-2],
          ],
          [userID-3] => [
                  [détails de la tache 3-1],
                  [détails de la tache 3-2],
          ],
    ],
    Ici, on a un tableau trié par jour de la semaine, du 06 au 08 septembre 2021.
    Chaque jour contient un array qui représente un utilisateur dont la clé est son ID et un tableau avec toutes les tâches pour cette journée

    Dans la réalité, on aura sûrement besoin de plus d'informations, donc voici quelque chose de plus réaliste :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    [2021-09-06] => [
        [userID-1] => [
            'last_name' => 'Doo',
            'first_name' => 'John',
            'tasks' => [
                [détails de la tache 1],
                [détails de la tache 2],
            ],
        ],
        [userID-2] => [
            'last_name' => 'Conor',
            'first_name' => 'Sarah',
            'tasks' => [
                [détails de la tache 2-1],
                [détails de la tache 2-2],
            ],
        ],
        [userID-3] => [
            'last_name' => 'World',
            'first_name' => 'Hello',
            'tasks' => [
                [détails de la tache 3-1],
                [détails de la tache 3-2],
            ],
        ],
    ],
    [2021-09-07] => [
        [userID-1] => [
            'last_name' => 'Doo',
            'first_name' => 'John',
            'tasks' => [
                [détails de la tache 1],
                [détails de la tache 2],
            ],
        ],
        [userID-2] => [
            'last_name' => 'Conor',
            'first_name' => 'Sarah',
            'tasks' => [
                [détails de la tache 2-1],
                [détails de la tache 2-2],
            ],
        ],
        [userID-3] => [
            'last_name' => 'World',
            'first_name' => 'Hello',
            'tasks' => [
                [détails de la tache 3-1],
                [détails de la tache 3-2],
            ],
        ],
    ],
    [2021-09-08] => [
        [userID-1] => [
            'last_name' => 'Doo',
            'first_name' => 'John',
            'tasks' => [
                [détails de la tache 1],
                [détails de la tache 2],
            ],
        ],
        [userID-2] => [
            'last_name' => 'Conor',
            'first_name' => 'Sarah',
            'tasks' => [
                [détails de la tache 2-1],
                [détails de la tache 2-2],
            ],
        ],
        [userID-3] => [
            'last_name' => 'World',
            'first_name' => 'Hello',
            'tasks' => [
                [détails de la tache 3-1],
                [détails de la tache 3-2],
            ],
        ],
    ],

  3. #3
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2013
    Messages : 29
    Par défaut
    Hello mon étoile noire préférée voilà qu'on se retrouve comme je l'avais prédit (vu ma newbitude)

    Alors je vois bien ce dont tu me parles mais en pratique je n'ai (pour l'instant) que l'extract MSSQL brute dont voici la fonction pour que tu captes le pourquoi du comment de l'array que j'ai :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    function bddtoarray($agence,$activite,$lundi,$dimanche) {
        require('config.php');
        setlocale(LC_TIME, 'fr','fr_FR','fr_FR@euro','fr_FR.utf8','fr-FR','fra');
        date_default_timezone_set('Europe/Paris');
        $lundi = $lundi->format('Y-d-m');
        $dimanche = $dimanche->format('Y-d-m');
        if($activite==NULL) {$activite='1';}
     
        $query = "SELECT
                    TA.idTaches AS Taches,
                    TA.idTypeTache AS TypeT,
                    TA.DateDebut AS Debut,
                    TA.DateFin AS Fin,
                    TA.Rouge AS R,
                    TA.Vert AS G,
                    TA.Bleu AS B,
                    TA.LibelleClient AS Client,
                    TA.AdresseChantier AS Chantier,
                    TA.Observation AS Note,
                    TA.NumFacture AS Fact,
                    PE.Nom AS Nom,
                    PE.Prenom AS Prenom,
                    PE.idPersonne as UserId,
                    PE.Ordre as Ordre
                FROM  bdd.Taches TA
                INNER JOIN bdd.PersonneFacturation PF
                    ON PF.idTaches=TA.idTaches
                INNER JOIN bdd.Personne PE
                    ON PF.idPersonnel = PE.idPersonne
                WHERE   PE.idAgence = '$agence'
                    AND PE.idTypeActivite = '$activite'
                    AND PE.DateSortie IS NULL 
                    AND PE.Indisponible = '1'
                    AND (('$lundi 08:30:00' BETWEEN TA.DateDebut AND TA.DateFin AND NOT TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59') OR TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59')
                ORDER BY Ordre,Debut ASC
                ";
        $result = sqlsrv_query($conn,$query, array(), array( "Scrollable" => 'static' ));
        while( $row = sqlsrv_fetch_array( $result) ) {
            $Taches[] = $row["Taches"];
            $TypeT[] = $row["TypeT"];
            $Debut[] = $row["Debut"];
            $Fin[] = $row["Fin"];
            $Red[] = $row["R"];
            $Green[] = $row["G"];
            $Blue[] = $row["B"];
            $Client[] = $row["Client"];
            $Chantier[] = $row["Chantier"];
            $Note[] = $row["Note"];
            $Fact[] = $row["Fact"];
            $Nom[] = $row["Nom"];
            $Prenom[] = $row["Prenom"];
            $UserId[] = $row["UserId"];
            $Ordre[] = $row["Ordre"];
        }
     
    	sqlsrv_free_stmt($result);
     
        if(!isset($Taches)) { $ListeTaches = NULL; }
        else {
            global $ListeTaches;
            $ListeTaches = ["Taches"=>$Taches,"TypeT"=>$TypeT,"Debut"=>$Debut,"Fin"=>$Fin, "R"=>$Red, "G"=>$Green, "B"=>$Blue, "Client"=>$Client, "Chantier"=>$Chantier, "Note"=>$Note, "Fact"=>$Fact, "Nom"=>$Nom, "Prenom"=>$Prenom, "UserId"=>$UserId, "Ordre"=>$Ordre];
        }
        return $ListeTaches;
     
    }
    Je me suis donc surement encore mal exprimé mais en fait c'est la mise en forme de ce tableau que je ne sais faire !
    Ce que j'ai copié est un extrait du var_dump($ListeTaches);

    En fait je viens de comprendre que toi tu n'aurais (bien évidemment) pas fait comme ça mais directement créé le tableau de la manière dont tu parles (ce qui au final et ce que je veux faire ) au lieu du bête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            $ListeTaches = ["Taches"=>$Taches,"TypeT"=>$TypeT,"Debut"=>$Debut,"Fin"=>$Fin, "R"=>$Red, "G"=>$Green, "B"=>$Blue, "Client"=>$Client, "Chantier"=>$Chantier, "Note"=>$Note, "Fact"=>$Fact, "Nom"=>$Nom, "Prenom"=>$Prenom, "UserId"=>$UserId, "Ordre"=>$Ordre];
    que j'ai écrit.

    Mais c'est là ou mes facultés se sont arrêtées du coup. Je vais donc plancher sur le moyen de le faire mais au final ma question reste la même je ne sais pas par quel bout prendre le problème.

    iLtG

  4. #4
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Hellow ! :-D


    Je vais commencer par simplifier un peu ton code grâce à l'utilisation de la fonction extract()

    Il est possible de remplacer :
    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
    $Taches[] = $row["Taches"];
            $TypeT[] = $row["TypeT"];
            $Debut[] = $row["Debut"];
            $Fin[] = $row["Fin"];
            $Red[] = $row["R"];
            $Green[] = $row["G"];
            $Blue[] = $row["B"];
            $Client[] = $row["Client"];
            $Chantier[] = $row["Chantier"];
            $Note[] = $row["Note"];
            $Fact[] = $row["Fact"];
            $Nom[] = $row["Nom"];
            $Prenom[] = $row["Prenom"];
            $UserId[] = $row["UserId"];
            $Ordre[] = $row["Ordre"];

    Par : extract($row);

    Par contre, je ne comprends pas ce que fais ce code.
    A priori, il extrait toutes les valeurs de $row (qui est un tableau), et si $row['Taches'] n'est pas vide, il va reconstruire tout le tableau pour redevenir +/- identique à $row sauf que cette fois il est mis dans $ListeTaches.
    D'ailleurs je vois qu'il y a un global ici. Déjà, j'aime pas trop l'utilisation de ce mot clé, faut être assez prudent quand on l'utilise et savoir ce qu'on fait ^^ Et c'est étrange d'avoir un global pour une valeur qu'on retourne :thinking:

    De plus, si tu voulais ajouter la valeur en cours au tableau $ListeTaches il faudrait alors écrire $ListeTaches[] = avec les crochets devant pour dire qu'on crée un tableau dans le tableau.

    Je n'ai pas trop le temps de regarder plus en profondeur pour le moment mais je reviendrai sur le topic

  5. #5
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2013
    Messages : 29
    Par défaut
    LOL ! bon OK en effet c'est plus court

    Alors je vais préciser ça peut être utile sur la compréhension et ça va surement faire rire, hurler (rayer la mention inutile ou pas) dans les chaumières :

    Tu m'as alerté sur le fait que balancer 117 fois la requête pour aller chercher les tâches de la journée (EVIDEMMENT !!!) c'était un peu le cœur du pb de la lenteur d'affichage de mon appli (5sec de content download passé à 79ms avec le code actuel) du coup bête et discipliné je suis allé modifier la requête pour, en une seule fois, aller chercher toutes les tâches de la semaine AINSI que les tâches qui "traversent" la semaine (ex: les congés payés, les arrêts maladie qui eux peuvent débuter AVANT la semaine en question et s'étaler sur plusieurs jours de la dite-semaine) (d'où l'espèce d'OVNI de WHERE sur les dates mais là encore si ça se trouve je fais n'importe quoi et je me fourvoie... Please ne me sort pas une fonction qui en 1 mot me fait le truc car je me pend direct avec le 1er câble cat6 que je trouve à portée !!! ).

    Du coup ça me pond un array ($listetaches) avec tout dedans indexé par l'ID de la tâche (qui est unique donc mais qui du coup fait qu'on a logiquement plusieurs fois les Users) mais qu'il faut remettre en forme (rien à voir avec la salle de sport !) et c'est là que mes capacités s'arrêtent je pensais plus simple de manipuler des arrays mais en fait non

    J'imaginais qu'avec ce tableau de bdd je pouvais facilement en php arriver au fameux tableau dont tu me parles qui serait parfait ^^ Mais c'est là ou je bloque
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    [2021-09-06] => [
        [userID-1] => [
            'last_name' => 'Doo',
            'first_name' => 'John',
            'tasks' => [
                [détails de la tache 1],
                [détails de la tache 2],
            ],
        ],
        [userID-2] => [
            'last_name' => 'Conor',
            'first_name' => 'Sarah',
            'tasks' => [
                [détails de la tache 2-1],
                [détails de la tache 2-2],
            ],
        ],
        [userID-3] => [
            'last_name' => 'World',
            'first_name' => 'Hello',
            'tasks' => [
                [détails de la tache 3-1],
                [détails de la tache 3-2],
            ],
        ],
    ],
    [2021-09-07] => [
        [userID-1] => [
            'last_name' => 'Doo',
            'first_name' => 'John',
            'tasks' => [
                [détails de la tache 1],
                [détails de la tache 2],
            ],
        ],
        [userID-2] => [
            'last_name' => 'Conor',
            'first_name' => 'Sarah',
            'tasks' => [
                [détails de la tache 2-1],
                [détails de la tache 2-2],
            ],
        ],
        [userID-3] => [
            'last_name' => 'World',
            'first_name' => 'Hello',
            'tasks' => [
                [détails de la tache 3-1],
                [détails de la tache 3-2],
            ],
        ],
    ],
    [2021-09-08] => [
        [userID-1] => [
            'last_name' => 'Doo',
            'first_name' => 'John',
            'tasks' => [
                [détails de la tache 1],
                [détails de la tache 2],
            ],
        ],
        [userID-2] => [
            'last_name' => 'Conor',
            'first_name' => 'Sarah',
            'tasks' => [
                [détails de la tache 2-1],
                [détails de la tache 2-2],
            ],
        ],
        [userID-3] => [
            'last_name' => 'World',
            'first_name' => 'Hello',
            'tasks' => [
                [détails de la tache 3-1],
                [détails de la tache 3-2],
            ],
        ],
    ],
    Je viens de tenter le extract($row); et j'ai pas compris car en fait il me remplace la variable $Taches à chaque itération du WHILE au lieu de remplir le tableau $Taches[]

    iLtG

  6. #6
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    mais qu'il faut remettre en forme (rien à voir avec la salle de sport !)
    MDR tu m'as tué

    Oups, j'ai lu trop vite ton code ! Effectivement, extract() n'est pas utilisé pour mettre dans des tableaux mais dans des variables, my bad j'ai mal lu

    Sinon pour le code, y'a moyen de faire ça hyper simplement :
    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
    30
    31
    32
    33
    34
    35
    <?php
    $agenda = [];
    $query = "SELECT
                    TA.idTaches AS Taches,
                    TA.idTypeTache AS TypeT,
                    TA.DateDebut AS Debut,
                    TA.DateFin AS Fin,
                    TA.Rouge AS R,
                    TA.Vert AS G,
                    TA.Bleu AS B,
                    TA.LibelleClient AS Client,
                    TA.AdresseChantier AS Chantier,
                    TA.Observation AS Note,
                    TA.NumFacture AS Fact,
                    PE.Nom AS Nom,
                    PE.Prenom AS Prenom,
                    PE.idPersonne as UserId,
                    PE.Ordre as Ordre
                FROM  bdd.Taches TA
                INNER JOIN bdd.PersonneFacturation PF
                    ON PF.idTaches=TA.idTaches
                INNER JOIN bdd.Personne PE
                    ON PF.idPersonnel = PE.idPersonne
                WHERE   PE.idAgence = '$agence'
                    AND PE.idTypeActivite = '$activite'
                    AND PE.DateSortie IS NULL 
                    AND PE.Indisponible = '1'
                    AND (('$lundi 08:30:00' BETWEEN TA.DateDebut AND TA.DateFin AND NOT TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59') OR TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59')
                ORDER BY Ordre,Debut ASC
                ";
    $result = sqlsrv_query($conn, $query, array(), array("Scrollable" => 'static'));
    while ($row = sqlsrv_fetch_array($result)) {
        $date_day = date('Y-m-d', strtotime($row['DateDebut']));
        $agenda[$date_day][$row['UserId']][] = $row;
    }

    Cependant, on se retrouve avec des données redondantes (à chaque fois les infos du User), on pourrait faire plus propre en vérifiant si on "connait" déjà l'utilisateur :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    <?php
    $agenda = [];
    $query = "SELECT
                    TA.idTaches AS Taches,
                    TA.idTypeTache AS TypeT,
                    TA.DateDebut AS Debut,
                    TA.DateFin AS Fin,
                    TA.Rouge AS R,
                    TA.Vert AS G,
                    TA.Bleu AS B,
                    TA.LibelleClient AS Client,
                    TA.AdresseChantier AS Chantier,
                    TA.Observation AS Note,
                    TA.NumFacture AS Fact,
                    PE.Nom AS Nom,
                    PE.Prenom AS Prenom,
                    PE.idPersonne as UserId,
                    PE.Ordre as Ordre
                FROM  bdd.Taches TA
                INNER JOIN bdd.PersonneFacturation PF
                    ON PF.idTaches=TA.idTaches
                INNER JOIN bdd.Personne PE
                    ON PF.idPersonnel = PE.idPersonne
                WHERE   PE.idAgence = '$agence'
                    AND PE.idTypeActivite = '$activite'
                    AND PE.DateSortie IS NULL 
                    AND PE.Indisponible = '1'
                    AND (('$lundi 08:30:00' BETWEEN TA.DateDebut AND TA.DateFin AND NOT TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59') OR TA.DateDebut BETWEEN '$lundi 00:00:00' AND '$dimanche 23:59:59')
                ORDER BY Ordre,Debut ASC
                ";
    $result = sqlsrv_query($conn, $query, array(), array("Scrollable" => 'static'));
    while ($row = sqlsrv_fetch_array($result)) {
        // On défini notre date du jour pour l'agenda
        $date_day = date('Y-m-d', strtotime($row['DateDebut']));
        // On défini les détails de la tâche
        $task = [
            'Taches' => $row['Taches'],
            'TypeT' => $row['TypeT'],
            'Debut' => $row['Debut'],
            'Fin' => $row['Fin'],
            'R' => $row['R'],
            'G' => $row['G'],
            'B' => $row['B'],
            'Client' => $row['Client'],
            'Chantier' => $row['Chantier'],
            'Note' => $row['Note'],
            'Fact' => $row['Fact'],
        ];
    //    // Ci-dessous, un autre moyen de définir les détails de la tâche
    //    $task = $row;
    //    unset($task['Nom']);
    //    unset($task['Prenom']);
    //    unset($task['UserId']);
    //    unset($task['Ordre']);
        /*** Fin de l'autre moyen de définir la tâche ***/
        // Si l'utilisateur n'existe pas, on va enregistrer ses infos
        // On pourrait également les sauvegarder dans un array à part étant donné qu'ils ont un ID unique
        if (empty($agenda[$date_day][$row['UserId']])) {
            $agenda[$date_day][$row['UserId']] = [
                'Nom' => $row['Nom'],
                'Prenom' => $row['Prenom'],
                'UserId' => $row['UserId'],
                'Ordre' => $row['Ordre'],
            ];
        }
        // Enfin, quoi qu'il arrive, on ajoute la tâche à la liste des tâches de l'utilisateur
        $agenda[$date_day][$row['UserId']]['tasks'][] = $task;
    }

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

Discussions similaires

  1. debutant ! filtre dans un état
    Par Dafbau dans le forum IHM
    Réponses: 2
    Dernier message: 24/09/2006, 14h50
  2. [MySQL] [Débutant] effectuer un tri sur un resultat
    Par philippe13 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 05/07/2006, 17h19
  3. [Performances]Filtre et tri en relation avec DB
    Par stoukou dans le forum Général Java
    Réponses: 6
    Dernier message: 19/09/2005, 12h46
  4. [debutant]XSL: Probleme tri et sommation !
    Par paparkha dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 12/08/2005, 21h23
  5. Comment faire le tri d'un array of array ?
    Par Tchouffy dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2005, 21h55

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