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 :

manipuler array avec while


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut manipuler array avec while
    Salut,
    J'ai une table tâches se présentant comme ceci :


    1 | 100 | -
    2 | 100 | 1
    3 | 45 | -
    4 | 30 | 1,2,3

    Colonne 1 : numéro de tâche
    Colonne 2 : pourcentage d'avancement de la tâche
    Colonne 3 : idx_tache pour connaitre l'état d'avancement d'une tache ayant besoin de tâche préalablement fini

    Statut_tache correspond à l'avancement de mes tâches qui se calcule en fonction de mes idx_taches
    Si statut_tache est égale à 0 alors ca veut dire que ma tâche est en attente si elle est comprise entre 1 et 99 ca veut dire qu'elle est en cours et 100 terminé.
    Prenons l'exemple de ma tâche 4, pour qu'elle soit fini à 100% il faut que les tâches 1,2 et 3 soient fini à 100%. Si la tâche 1 est terminé, mais que la tâche 2 et 3 est en cours alors le statut de ma tâche 4 sera "en cours".
    Je ne suis pas très claire, mais j'espère que vous comprendrez un minimum.
    Ce que je souhaites faire c'est récupérer les idx_taches de chacune de mes tâches et analyser leur statut(un par un) pour donner un et un seul statut !
    voici mon code :
    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
     
    $idx_actions = "select idx_action, num_tache from table
    ";
    $query_action = mysql_query($idx_actions);
    $rows = mysql_num_rows($query_action);
    while ($parcours = mysql_fetch_array($query_action))
    {
    	$explode_action = explode(',' , $parcours[0]);
    	//print_r($test = array($parcours[1] => $explode_action));
    	foreach( $explode_action as $value ) {
    	$req_stat = "SELECT tableau_statut FROM tableau_bord WHERE tableau_int = '".$value."' ";
    	$query_stat = mysql_query($req_stat);
    		while($le_parcours = mysql_fetch_array($query_stat))
    		{
    			$array = array($parcours[1] => $le_parcours[0]);
    		}
    	}
    }

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta structure n'est pas bonne.
    Il faut une table qui recense les relations.
    id - tache - relation
    1 - 2 - 1
    2 - 4 - 1
    3 - 4 - 2
    4 - 4 - 3

    En une requête tu peux par exemple avoir le nombre de taches liées et non terminées :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.avancement, table2.count(tache) as taches_liees FROM table1 a
    LEFT JOIN table2 ON a.id = table2.tache
    JOIN table1 b ON table2.relation = b.id
    WHERE a.id = 4 AND b.avancement < 100
    ou le détail des taches liées
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tache, avancement FROM table2
    JOIN table1 b ON table2.relation = b.id
    WHERE a.id = 4
    (je n'ai pas validé la requête)

  3. #3
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Merci de ta réponse sabotage, c'est vrai que c'est plus cohérent d'avoir une table relation je n'y avais pas pensé...
    j'ai donc mis en place ma nouvelle table, j'affiche correctement le statut et les relations... et je voudrais un autre conseil... comment ferais-tu pour "regrouper" mes relations
    c'est à dire par exemple :
    id - tache - relation
    1 - 2 - 1
    2 - 4 - 1
    3 - 4 - 2
    4 - 4 - 3
    Prenons la tâche 4 qui aura qu'un statut(en cours, en attente ou terminé) si la 1,2,3 sont en attente, alors la 4 sera en attente, si une des trois relations est en cours alors la 4 sera en cours, si elles sont terminées alors la 4 sera terminée.
    Je dois faire une requête pour chaque état ? ou y-a t-il une solution plus simple ?

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le plus simple est de lire les états de toutes les tâches liées

    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
     
    $attente = FALSE;
    $avancement = 0;
    $nbre_taches = mysql_num_rows($result);
    while ($row = mysql_fetch_assoc($result)) {
       if ($row['avancement'] == 0) {
             $attente = TRUE;
       }
       $avancement += $row['avancement'];
    }
     
    if ($attente) {
       $etat = 'En attente';
    }
    elseif ($avancement == $nbre_taches * 100) {
       $etat = 'Terminé';
    }
    else {
        $etat = $avancement / $nbre_taches;
    }

  5. #5
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    J'ai modifié ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ($attente == TRUE) {
    		$etat = 'En attente';
    		}
    par celui la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ($attente == TRUE && $avancement == 0) {
    		$etat = 'En attente';
    		}
    Car si il rentre dans ma boucle la premiere fois et que l'état est à 0 alors $attente est à TRUE, et si mon autre tâche est à 55 % il m'affichais quand même en attente...
    Par contre ca ne le fait pas pour chaque tâche, je voudrais par exemple l'état de chacune de mes tâches la il regroupe tous mes tâche en un...

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce n'est pas logique : si tu as même une seule tâche en attente, tout ton projet est en attente ; mais bon ce n'est plus une question de code.

    Pour le reste, l'idée était de determiner l'état d'une tache en fonction de taches liées, c'est bien ça que tu voulais non ?

  7. #7
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    1) Et non parce que si j'ai une tâche en attente et une tâche en cours, mon projet est "en cours" et non en attente étant donné qu'il as démarré une tâche...
    2) Oui c'est bien cela que je voulais...
    dans ma base de données pour l'instant j'ai deux tâches avec des tâches liées, donc je voudrais afficher l'état de ces deux tâches en fonction des tâches liées de chacunes d'elles...

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Regarde ce que te donne une requête comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.tache as tache, b.tache as tache_liee, b.avancement FROM table1 a LEFT JOIN table2
    JOIN table1 b ON table2.relation = b.id
    WHERE a.id = 4

  9. #9
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Euh je comprends pas la requête.. .je construis jamais mes requêtes avec des left join...
    Pourquoi mettre a.id = 4 ?
    Voila la requête que j'ai actuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT tache, tableau_statut
    FROM tableau_bord, relation
    WHERE tableau_bord.tableau_int = relation.relation
    alors je sélectionne les tâches(table relation) ainsi que leur statut(table tableau_bord) en allant les chercher dans relation et tableau_bord ensuite je fais la jointure entre les deux tables
    tableau_bord.tableau_int = id des tâches
    relation.relation = les tâches liées.

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pourquoi mettre a.id = 4 ?
    Me suis trompé

  11. #11
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Ah d'accord,
    donc du coup revenons à nos moutons, comment faire pour afficher le statut de chacune de mes tâches en fonction des tâches liées ?
    ma requête me semble correcte mais étant donné que la vérif se fait en dehors du while, il prends en compte qu'une seule tâche mais si je le met dans le while il va m'afficher autant de fois "en attente" qu'il y a de tâche en attente...

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta requête n'est pas bonne elle ne remonte pas l'avancement des taches liées (et la syntaxe de ta jointure est fausse).

  13. #13
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Ma requête donné plus haut me donne ca comme résultat :
    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
     
    tache 	tableau_statut
    35 	0
    35 	0
    35 	100
    36 	0
    36 	0
    36 	0
    36 	75
    36 	55
    36 	100
    36 	12
    36 	28
    36 	87
    36 	0
    36 	56
    36 	100
    j'ai essayé un group by tableau_statut et ca m'enlève les "doublons"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT tache, tableau_statut
    FROM tableau_bord, relation
    WHERE tableau_bord.tableau_int = relation.relation
    group by tableau_statut, tache
    et le resultat donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    tache 	tableau_statut
    35 	0
    36 	0
    36 	12
    36 	28
    36 	55
    36 	56
    36 	75
    36 	87
    35 	100
    36 	100
    pourquoi ma requête n'est pas bonne ?
    EDIT : tableau_statut = avancement provenant de ma table tableau_bord

  14. #14
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    pourquoi ma requête n'est pas bonne ?
    Elle ne te donne pas les liaisons entre tes taches liées.

    Regarde la requête que je t'ai proposée.

  15. #15
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Au risque de paraitre un peu niaise
    je ne comprends pas les requêtes avec les JOIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT a.tache as tache, b.tache as tache_liee, b.avancement FROM table1 a LEFT JOIN table2
    JOIN table1 b ON table2.relation = b.id

  16. #16
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    par exemple au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tache, tableau_statut
    FROM tableau_bord, relation
    WHERE tableau_bord.tableau_int = relation.relation
    tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tache, tableau_statut
    FROM tableau_bord JOIN relation
    ON tableau_bord.tableau_int = relation.relation

  17. #17
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Oui ca j'avais compris c'est le left join que j'avais pas captée...
    ca me donne le même résultat que ma requête précédente :
    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
     
    tache 	tableau_statut
    35 	0
    35 	0
    35 	100
    36 	0
    36 	0
    36 	0
    36 	75
    36 	55
    36 	100
    36 	12
    36 	28
    36 	87
    36 	0
    36 	56
    36 	100

  18. #18
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Le left join retourne les éléments de la table a gauche même s'ils n'ont pas de correspondance dans la table à droite.

  19. #19
    Membre actif Avatar de Meloooo
    Femme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 324
    Points : 288
    Points
    288
    Par défaut
    Ah d'accord, mais de toute façon les les tâches que j'ai dans ma table relation sont forcément dans la table tableau_bord, le left join me sert-il ?
    Désolé de poser des questions stupides, mais je connais vraiment pas cette syntaxe pour les requêtes, je suppose que cette syntaxe est mauvaise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT tache, tableau_statut
    FROM tableau_bord LEFT JOIN relation JOIN  relation
    ON tableau_bord.tableau_int = relation.relation
    EDIT :
    ou peut etre celle la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T.tableau_statut, R.tache
    FROM tableau_bord AS T
    LEFT OUTER JOIN relation AS R ON T.tableau_int = R.relation
    ce qui me donne ceci :
    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
     
    tableau_statut 	tache
    0 	NULL
    0 	NULL
    0 	NULL
    0 	NULL
    75 	NULL
    18 	NULL
    100 	36
    65 	NULL
    21 	NULL
    5 	NULL
    0 	NULL
    20 	NULL
    100 	35
    32 	NULL
    56 	36
    0 	NULL
    0 	NULL
    0 	35
    0 	36
    87 	36
    28 	36
    12 	36
    0 	NULL
    100 	36
    55 	36
    75 	36
    0 	36
    0 	36
    0 	36
    0 	35
    je vois pas trop l'intérêt...

Discussions similaires

  1. [PHP 5.4] manipulation les données d'un array avec foreach et for
    Par aspkiddy dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2014, 00h22
  2. Manipulation d'arrays avec Boost Spirit
    Par milene31 dans le forum Boost
    Réponses: 10
    Dernier message: 24/06/2013, 14h35
  3. Manipuler des tableaux / Array avec VBA
    Par funtim78 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 12/06/2012, 15h02
  4. [ODBC] manipuler .dbf avec php
    Par jumars dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/05/2009, 10h49
  5. [Tableaux] problème avec while
    Par zimotep dans le forum Langage
    Réponses: 3
    Dernier message: 11/09/2005, 10h30

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