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 :

Somme dans un tableau multidimensionnel


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Somme dans un tableau multidimensionnel
    Bonjour,

    Je suis nouveau sur developpez.net. En général, j'arrive à me débrouiller pour trouver des solutions avec google-est-ton-ami, mais là, je pèche et je me dis qu'il devrait y avoir un système simple pour répondre à mon problème.

    Voici le principe. J'ai un tableau multidimensionnel qui stocke des statistiques concernant des élèves dans une école, dont voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ci['f']['h'][1] = 17
    $ci['f']['f'][1] = 12
    $ci['d']['h'][1] = 42
    $ci['d']['f'][1] = 31
    $ci['f']['h'][2] = 11
    $ci['f']['f'][2] = 32
    $ci['d']['h'][2] = 6
    $ci['d']['f'][2] = 2
    La première clé indique la langue (f=français, d=allemand), la deuxième le sexe (h=homme, f=femme), la troisième l'année scolaire (1 ou 2).

    J'aimerai calculer beaucoup de statistiques depuis ces informations, dont par exemple :

    La somme des femmes de toutes les langues et toutes les années : array_sum($ci[...]['f'][...]), où les ... représentent n'importe quelle variable dans mon tableau.
    La somme de toutes les francophones : array_sum($ci['f'][...][...])
    La somme de tous les francophones de 2e année : array_sum($ci['f'][...][2])

    Y a-t-il une possibilité de faire ça de manière simple ?

    Merci d'avance pour vos conseils avisés. :-)
    Bertrand

  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
    Ton tableau n'est pas adapté pour faire ça.
    Ce n'est pas impossible mais cela nécessiterait de parcourir le tableau.

    Une base de données serait plus performante.

    Le tableau multidimensionnel, representant une hierarchisation des données, n'est de toute façon pas nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ci[] = array('langue'=>'f', 'sexe'=>'h', 'annee'=>1, 'note' = 17);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Mouais... J'avais cette impression, mais comme je trouve que ce serait drôlement pratique de pouvoir faire ça, je me suis dit qu'il y avait peut-être une fonction que je ne connaissais pas. En fait, j'utilise le tableau multidimensionnel pour stocker une seule valeur non hiérarchisée, c'est juste. Faut que j'y réfléchisse un peu pour voir s'il n'y aurait pas mieux à faire.

    Les infos sont directement tirées d'un grosse db qui contient l'ensemble des informations des élèves, et là, ce sont des stats en temps réel, alors je n'avais pas forcément envie de stocker tout ça dans une db "temporaire" pour les réexporter directement en les traitant.
    En fait, je dois recréer un tableau de statistiques anciennement fait sous Excel, dont chaque élément du tableau est une case, et je dois sommer toutes les colonnes et toutes les lignes, voire une colonne sur 2 ou sur 4... et je voulais m'économiser un peu de travail plutôt que de coder des additions.

    Merci pour ta réponse en tous cas. Je vais me résoudre à coder un peu plus tristement.

  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
    Les sommes des lignes et les sommes des colonnes sont données facilement par un SGDB.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oui, mais vu la complexité des requêtes que je fais pour extraire les stats, cela nécessite clairement que j'entre ces résultats dans une db pour les traiter. A voir si c'est utile et adéquat comme je suis en temps réel.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Attention, le tableau comme tu l'as présente un risque d'écrasement: si tu as deux sous-tableaux quasi-identiques, le 2e va écraser le premier. Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ci['f']['h'][1] = 17; //17 va être écrasé.
    $ci['f']['h'][1] = 12;
    Sinon, tu peux accomplir ce que tu veux faire avec JMESpath.php (https://github.com/jmespath/jmespath.php). La syntaxe est toutefois assez difficile avec ton style de tableau, je te conseille donc de modifier ton tableau pour ajouter des index explicites pour mieux le manipuler.
    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
     
    $ci = [
      ['lang' => 'f', 'gender' => 'h', 'year' => 1, 'grade' => 17], 
      ['lang' => 'f', 'gender' => 'f', 'year' => 1, 'grade' => 12], 
        ['lang' => 'd', 'gender' => 'h', 'year' => 1, 'grade' => 42], 
        ['lang' => 'd', 'gender' => 'f', 'year' => 1, 'grade' => 31], 
        ['lang' => 'f', 'gender' => 'h', 'year' => 2, 'grade' => 11], 
        ['lang' => 'f', 'gender' => 'f', 'year' => 2, 'grade' => 32], 
        ['lang' => 'd', 'gender' => 'h', 'year' => 2, 'grade' => 6], 
        ['lang' => 'd', 'gender' => 'f', 'year' => 2, 'grade' => 2], 
    ];
     
    //Recherche des notes des femmes francophones
    $femmes_francophones_exp = '[?lang == `f`] | [?gender == `f`].grade';
     
    $femmes_francophones = JmesPath\search($femmes_francophones_exp, $ci);
     
    print_r($femmes_francophones);
    //tu peux faire un array_sum pour totaliser la note des femmes francophones.
     
    //Allemands première année
    $allemands_premiere_exp = "[?lang==`d`] | [?year==`1`].grade";
     
    $allemands_premiere = JmesPath\search($allemands_premiere_exp, $ci);
     
    print_r($allemands_premiere);
    Avec ça, à la fin tu reçois un tableau unidimensionnel que tu peux ensuite utiliser pour toutes sortes d'opérations: somme des notes, moyenne des notes, nombre de francophones, nombre d'hommes germanophones, nombre d'hommes et femmes francophones ayant une moyenne supérieure à 16, etc ....

    Il faut "juste" apprendre la syntaxe du JMESPath ici http://jmespath.org/examples.html et ici http://jmespath.org/tutorial.html

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/12/2009, 15h02
  2. Calculer une somme dans un tableau
    Par nawak.seb dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 10/02/2009, 16h21
  3. Poucentage d'une somme dans un tableau croisé
    Par leloup84 dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 07/04/2008, 11h33
  4. % du somme dans un tableau croisé
    Par leloup84 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 31/03/2008, 15h31
  5. Réponses: 2
    Dernier message: 04/11/2007, 08h43

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