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

  1. #1
    Membre à l'essai
    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
    Points : 12
    Points
    12
    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 é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 : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    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 à l'essai
    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
    Points : 12
    Points
    12
    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 é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 : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    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 à l'essai
    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
    Points : 12
    Points
    12
    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 é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 : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    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;
    }

  7. #7
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut


    Merci

    Ouais j'avais lu la doc php extract() et je ne captais pas ça me rassure sur mes capacités cognitives

    Je vais donc étudier tout ça mais je pressent déjà un souci car la construction de ma page est en 'ligne', je m'explique :

    D'abord voici la partie de mon code qui affiche le planning (ça peut aider à comprendre) :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
            <div class="table-wrapper">
                <div class="divTableHeading">
                    <div class="divTableRow">
                        <div class="row-title premcase">Semaine<br><?php echo $semaine;?></div>
                        <?php
                            list_gars($_SESSION['agenceid'],$_SESSION['activite']);
                            affiche_gars($tabgars); 
                        ?>
                    </div>
                </div>
                <div class="divTableBody">
                    <div class="divTableRow">
                        <div class="row-title premcol"><hr class="test">Lundi<br><?php echo $lundi->format('d/m/Y');?></div>
                        <?php
                            rempli_tab($tabgars,$lundi);
                        ?>
                    </div>
                    <div class="divTableRow">
                        <div class="row-title premcol"><hr class="test">Mardi<br><?php echo $mardi->format('d/m/Y');?></div>
                        <?php
                            rempli_tab($tabgars,$mardi);
                        ?>
                    </div>
                    <div class="divTableRow">
                        <div class="row-title premcol"><hr class="test">Mercredi<br><?php echo $mercredi->format('d/m/Y');?></div>
                        <?php
                            rempli_tab($tabgars,$mercredi);
                        ?>
                    </div>
                    <div class="divTableRow">
                        <div class="row-title premcol"><hr class="test">Jeudi<br><?php echo $jeudi->format('d/m/Y');?></div>
                        <?php
                            rempli_tab($tabgars,$jeudi);
                        ?>
                    </div>
                    <div class="divTableRow">
                        <div class="row-title premcol"><hr class="test">Vendredi<br><?php echo $vendredi->format('d/m/Y');?></div>
                        <?php
                            rempli_tab($tabgars,$vendredi);
                        ?>
                    </div>
                    <div class="divTableRow">
                        <div class="row-title premcol"><hr class="test">Samedi<br><?php echo $samedi->format('d/m/Y');?></div>
                        <?php
                            rempli_tab($tabgars,$samedi);
                        ?>
                    </div>
                    <div class="divTableRow">
                        <div class="row-title premcol"><hr class="test">Dimanche<br><?php echo $dimanche->format('d/m/Y');?></div>
                        <?php
                            rempli_tab($tabgars,$dimanche);
                        ?>
                    </div>
                </div>
            </div>

    Pour l'instant j'ai une construction ou j'ai un tablehead ou je dresse la liste des utilisateurs d'une agence en x (après une case avec le numéro de semaine) via une fonction list_gars($agence,$activite) qui les sort dans l'ordre défini par leur variable bien nommée (Ordre)

    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
    function list_gars($agence,$activite) {
        require('config.php');
        if($activite==NULL) {$activite='1';}
        $query = "SELECT
                        Nom,Prenom,idPersonne
                    FROM bdd.Personne 
                    WHERE idAgence = '$agence'
                    AND idTypeActivite = '$activite'
                    AND DateSortie IS NULL 
                    AND Indisponible = '1'
                    ORDER BY Ordre ASC                       
                            ";
                    $result = sqlsrv_query($conn,$query, array(), array( "Scrollable" => 'static' ));
                    while( $row = sqlsrv_fetch_array( $result) ) {
                        $NomGars[] = $row["Nom"];
                        $PrenomGars[] = $row["Prenom"];
                        $IdGars[] = $row["idPersonne"];
                    }
                    global $tabgars;
                    $tabgars = ["IdGars"=>$IdGars,"Nom"=>$NomGars,"Prenom"=>$PrenomGars];
                    return $tabgars;
    }
    ensuite j'ai 7 lignes (pour chaque jour) ou je dresse la liste des tâches de l'utilisateur encore en x (après une case avec la date du jour) via une fonction rempli_tab($tabgars,$date_du_jour_de_la_semaine_en_cours) qui va chercher les tâches de chaque gars dans l'ordre pour le jour en question et les affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function rempli_tab($t,$d) {
        for($i=0;$i<count($t['IdGars']);$i++){
            echo "<div class=divTableCell>";
            $tachlist = recuptaches($t['IdGars'][$i],$d);
            if($tachlist != NULL) {affichetaches($tachlist,$d);}
            echo "</div>";
        }
    }
    La fonction d'affichage on s'en fout un peu tu la connais de toutes manières c'est celle que je t'ai montrée ou j'ai fini par utiliser le display grid

    Celle qui pose pb (et ralentit le traitement c'est la recuptaches($t['IdGars'][$i],$d) vu qu'elle est lancée autant de fois que de gars et cela x7 jours de la semaine)) la voici :

    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
    function recuptaches($userid,$datetache) {
        require('config.php');
        setlocale(LC_TIME, 'fr','fr_FR','fr_FR@euro','fr_FR.utf8','fr-FR','fra');
        date_default_timezone_set('Europe/Paris');
        $tachedate = $datetache->format('Y-d-m');
     
     
     
        $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
                FROM  bdd.Taches TA
                INNER JOIN bdd.PersonneFacturation PF
                ON PF.idTaches=TA.idTaches
                WHERE PF.idPersonnel = '$userid'
                -- d'abord récupérer les tâches qui "traversent" la journée
                AND (('$tachedate 08:30:00' BETWEEN TA.DateDebut AND TA.DateFin
                AND NOT TA.DateDebut BETWEEN '$tachedate 00:00:00' AND '$tachedate 23:59:59')
                -- et celles qui sont dans la journée
                OR TA.DateDebut BETWEEN '$tachedate 00:00:00' AND '$tachedate 23:59:59')
                ORDER BY TA.DateDebut 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"];
        }
     
    	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];
        }
        return $ListeTaches;
     
    }
    Du coup dans ma tête je remplaçais les 2 fonctions list_gars() et recuptaches() par 2 fonctions PHP qui exploitait l'extract de bdd MSSQL qui lui contenait la totalité mais c'est là ou je me suis perdu en route et que je ne sais plus ou j'en suis car ce que tu me proposes est surement exploitable mais il faut que je vois en PHP comment l'adapter à ce que j'ai déjà (ou tout repenser l'affichage de ma page pour la énième fois )

    Parce que si je ne m'abuse ce que ça me sort là c'est indexé sur la date de début de la tâche alors qu'en fait il faudrait que ce soit indexé dans l'ordre par le userID et qu'ensuite je puisse en fonction de la date ne récupérer que les tâches qui commencent le jour J ou qui "passent" par le jour J (rappelle toi j'ai pris le parti, pour des raisons de simplicité, d'afficher les tâches de plusieurs jours en Y en mettant le début de la tâche le jour J puis si elle dépasse la "recopier" le jour d'après en remplaçant l'heure de départ de la tâche par le mot "suite" ex

    Nom : tab1.png
Affichages : 40
Taille : 31,0 Ko

    Ce qui marche aussi du coup pour les tâches qui peuvent débuter 1 semaine avant et terminer une semaine après la semaine en cours (comme les congés les arrêts etc etc)

    Ce qui est la misère c'est que je pensais ne pas être loin du compte car c'était juste un pb de temps d'affichage et que là je me sens paumé

    Je vais donc de ce pas étudier le pb et voir si je peux adapter ce que tu m'as donné pour indexer ça par UserId dans un 1er temps et faire une fonction PHP pour lister les gars dans un 1er temps (vu que c'est la plus simple par rapport à celle qui rempli le tableau)

    iLtG

  8. #8
    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 : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

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

    C'est justement pour cette raison que j'utilise les index "nommés" de mon tableau.
    Au lieu d'utiliser des index auto-incrémentés, en définissant la valeur des index il est facile d'accéder directement à une valeur.

    Si on considère que le code que je t'ai donné précédemment crée un tableau qui contient toutes les tâches de tous les utilisateurs de cette semaine-ci.
    Par exemple, tu voudrais récupérer les tâches de ton User qui a l'ID 1337 pour mardi, il suffit d'écrire : $agenda['2021-09-07'][1337]['tasks'].

    Ici évidemment ça n'a pas de sens d'écrire tout en dur mais dans la construction de ton calendrier tu dois suivre les dates
    Actuellement, il me semble que tu connais jamais vraiment la date du jour d'après ton code mais je trouve ça bizarre donc je me trompe peut-être. Parce que je vois $lundi, $mardi, $mercredi, etc c'est étrange ^^
    Mais tu dois forcément connaitre la date vu que tu faisais une requête à chaque fois, donc ça devrait être : $agenda[$date_du_jour_de_la_semaine_en_cours][$tabgars['IdGars']]['tasks'].

    Les tableaux c'est compliqué au début, surtout dans cette dernière solution avec tous les crochets dans tous les sens, faut s'y habituer un peu et puis ça devient trivial ^^

  9. #9
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Salut,

    oui mais ça c'est sans compter les fameuses tâches qui ne commence pas le jour J car dans ton code date_day s'appuie sur DateDebut qui est la date de début de la tâche mais j'ai aussi besoin d'afficher un congé par ex qui peut avoir comme DateDebut la semaine d'avant :

    Ex: Le congé d'un utilisateur 1337 commence le 23/08 et fini le 12/09 donc DateDebut est 23/08, dans la case de lundi 06/09 si j'affiche : $agenda['2021-09-06'][1337]['tasks'], il ne sera jamais visible

    D'où mon idée de départ d'affilier les tâches aux Users et de tester uniquement les dates des tâches pour afficher que celle qui sont du jour ou qui "traverse" le jour (sachant en plus qu'une tâche peut être affectée à plusieurs Users donc il y aura aussi du coup de ce côté un doublon mais on ne peut pas y couper)

    D'ou le fait que je voulais faire une fonction de filtrage pour n'afficher que les tâches pour un userID qui sont dans la journée ou "traversent" la journée car je vois pas comment faire autrement que par un filtre.

    Mais je commence à comprendre un peu mieux les tableaux seulement je ne suis par ex pas opé sur comment filtrer le contenu d'un tableau.

    Pour la date du jour en effet vu qu'il y en a que 7 je me suis permis de la stocker dans une variable par jour ^^ Ca me permet ensuite de faire un date picker pour aller chercher la semaine qu'on veut (et surement faire 2 boutons pour semaine suivante/précédente mais ça ce sera quand mon planning s'affichera correctement et rapidement ) et donc faire varier les $jour_de_la_semaine facilement.

  10. #10
    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 : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

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

    Ca ne change rien au tableau.
    Si tu as plusieurs tables sur lesquelles faire des requêtes, tu fais tes requêtes et tu remplis le tableau au fur et à mesure

    De même, si tu as des tâches sur plusieurs jours, tu pourrais boucler sur la date de départ jusqu'à la date de fin pour remplir le tableau.

    Concernant ce dernier point, je n'étais pas conscient qu'il y avait des tâches sur plusieurs jours, on pourrait alors prendre le problème autrement car sinon ça va faire un énorme tableau avec plein de redondances.
    Créer le tableau par rapport à chaque utilisateur (donc c'est +/- pareil que le tableau précédent sauf qu'on a toutes les tâches d'un utilisateur pour la période/semaine et non pour un jour)
    Ensuite, dans ta cellule, tu parcours toutes les tâches de l'utilisateur et tu n'affiches que celles qui doivent être affichées pour le jour en cours

  11. #11
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par toi
    Créer le tableau par rapport à chaque utilisateur (donc c'est +/- pareil que le tableau précédent sauf qu'on a toutes les tâches d'un utilisateur pour la période/semaine et non pour un jour)
    Ensuite, dans ta cellule, tu parcours toutes les tâches de l'utilisateur et tu n'affiches que celles qui doivent être affichées pour le jour en cours
    Citation Envoyé par moi
    D'où mon idée de départ d'affilier les tâches aux Users et de tester uniquement les dates des tâches pour afficher que celle qui sont du jour ou qui "traverse" le jour (sachant en plus qu'une tâche peut être affectée à plusieurs Users donc il y aura aussi du coup de ce côté un doublon mais on ne peut pas y couper)
    Huhu ^^

    Du coup voilà ce que j'ai fait :

    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
        while ($row = sqlsrv_fetch_array($result)) {
            // 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'],
            ];
            // Si l'utilisateur n'existe pas, on va enregistrer ses infos
            if (empty($planning[$row['UserId']])) {
                $planning[$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
            $planning[$row['UserId']]['Tasks'][$row['Taches']] = $task;
        }
    Et voici enfin ma fonction pour afficher la liste des Users en entête de colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function affiche_gars($t) {
        $keys = array_keys($t);
        for($i = 0; $i < count($t); $i++) {
            echo "<div class=divTableHead>".$t[$keys[$i]]['Nom']."<br>".$t[$keys[$i]]['Prenom']."</div>";
        }
    }
    Je commence à comprendre merci (me reste à comprendre comment filtrer un array par un test sur une valeur (en l'occurrence les dates des tâches)

    iLtG

  12. #12
    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 : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Ouais voilà c'est pas mal

    Maintenant pour afficher les tâches du jour, j'imagine qu'il suffit de faire quelque chose qui s'approche de :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    foreach($t[$keys[$i]]['tasks'] AS $task) {
        if($task['Debut'] == $today || ($task['Debut'] <= $today && $task['Fin'] <= $today)) {
            // La tâche correspond à aujourd'hui !
        }
    }

    $today étant plutôt la date du jour de la cellule et non pas vraiment aujourd'hui ^^

  13. #13
    Membre à l'essai
    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
    Points : 12
    Points
    12
    Par défaut
    Hello,

    Merci encore à toi car tout est OK maintenant je suis passé de 5sec d'affichage à 1.9sec pour une agence de 14 personnes ce qui est correct à mes yeux vu le nombre d'info à récupérer et l'utilisation qu'ils vont en avoir

    Voici la fonction finale :

    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
    function rempli_tab($t,$d) {
        setlocale(LC_TIME, 'fr','fr_FR','fr_FR@euro','fr_FR.utf8','fr-FR','fra');
        date_default_timezone_set('Europe/Paris');
        //creation de l heure d embauche
        $d8 = clone $d->SetTime(8,30,0);
        //creation de l heure de debut de journee
        $d0 = clone $d->SetTime(0,0,0);
        //creation de l heure de fin de journee
        $d24 = clone $d->SetTime(23,59,59);
        //recuperation des usersID
        $keys = array_keys($t);
        //boucle pour créer chaque cellule de chaque user
        for($i=0;$i<count($t);$i++){
            echo "<div class=divTableCell>";
            //initialisation du compteur de taches du user ce jour
            $j=0;
            //initialisation de la liste des taches du user ce jour
            $tachlist = [];
            //test pour eliminer le cas ou le user n a pas de tache ce jour
            if(isset($t[$keys[$i]]['Tasks'])) {
                //boucle pour tester les taches et remplir le tableau des taches si elles sont ou traversent la journee du user ce jour
                foreach($t[$keys[$i]]['Tasks'] AS $task) {
                    if(((($task['Debut'] < $d8) && ($d8 < $task['Fin'])) && (!(($d0 < $task['Debut']) && ($task['Debut'] < $d24)))) || (($d0 < $task['Debut']) && ($task['Debut'] < $d24))) {
                        $tachlist['Taches'][$j] = $task['Taches'];
                        $tachlist['TypeT'][$j] = $task['TypeT'];
                        $tachlist['Debut'][$j] = $task['Debut'];
                        $tachlist['Fin'][$j] = $task['Fin'];
                        $tachlist['R'][$j] = $task['R'];
                        $tachlist['G'][$j] = $task['G'];
                        $tachlist['B'][$j] = $task['B'];
                        $tachlist['Client'][$j] = $task['Client'];
                        $tachlist['Chantier'][$j] = $task['Chantier'];
                        $tachlist['Note'][$j] = $task['Note'];
                        $tachlist['Fact'][$j] = $task['Fact'];
                        $j++;
                    }
                }
            } 
            if($tachlist != NULL) {affichetaches($tachlist,$d);}
            echo "</div>";
        }
    }
    J'ai, je pense, maintenant un peu mieux compris la manipulation des arrays, merci à toi.

    A+ pour de nouvelles aventures

    iLtG

+ 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, 13h50
  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, 16h19
  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, 11h46
  4. [debutant]XSL: Probleme tri et sommation !
    Par paparkha dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 12/08/2005, 20h23
  5. Comment faire le tri d'un array of array ?
    Par Tchouffy dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2005, 20h55

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