Somme tableau mutlidimensionnel

Petit nouveau ! | 2 Messages

01 déc. 2015, 00:35

Bonjour,

Je suis nouveau sur phpFrance. 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 :

$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

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

01 déc. 2015, 11:02

Bonjour,

La solution la plus simple à mon sens c'est de mettre ces infos dans une base de données que tu pourras alors requêter bcp + facilement et tu disposeras de toutes les fonctions mathématiques utiles pour sortit toutes tes statistiques.

A défaut, tu va être obligé de coder des fonctions PHP pour chaque type de stats qui vont parcourir tes tableaux à chaque fois pour ne garder que les valeurs qui t'intéressent et effectuer le calcul. C'est plus complexe et beaucoup moins flexible qu'une base de données, à mon sens.
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 2 Messages

02 déc. 2015, 08:27

Merci pour ta réponse.

Le truc c'est que je fais du temps réel (sans actualisation toutefois), alors le stockage dans une db me semblait être une étape en trop. Je suis en train de voir ce que je peux faire avec JMESPath, ça a l'air pas mal, mais j'en suis au stade de la découverte. Sinon, c'est clairement la db qui sera la meilleure solution.

Mammouth du PHP | 1967 Messages

02 déc. 2015, 11:09

Te serait il possible de changer la structure de ton tableau ?
$tab[] = array('langue' = 'd', 'sexe' => 'h', 'année' => 1, 'nombre' => 32);
Ensuite pour tes statistiques, tu boucle ton tableau et selon quelques conditions logiques tu additionnes tes "nombre"
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 déc. 2015, 11:19

Te serait il possible de changer la structure de ton tableau ?
$tab[] = array('langue' = 'd', 'sexe' => 'h', 'année' => 1, 'nombre' => 32);
+1, ça serait plus lisible et ça rendrait ton code + facilement maintenable quand tu auras besoin de te replonger dedans dans quelques mois ou années ^^
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

07 déc. 2015, 16:31

Son tableau set certes pas lisible mais est toutes fois navigable avec un foreach, du style:

Code : Tout sélectionner

<?php $ci=array(); $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; $Params=array(); $Params['fr-homme-1']=0; $Params['fr-homme-2']=0; $Params['fr-femme-1']=0; $Params['fr-femme-2']=0; $Params['de-homme-1']=0; $Params['de-homme-2']=0; $Params['de-femme-1']=0; $Params['de-femme-2']=0; foreach($ci as $dim => $val){ //Français: if($dim=='f'){ if(isset($val['h'])){//homme: //1er année: if(isset($val['h'][1])) $Params['fr-homme-1']+=$val['h'][1]; //2eme année: if(isset($val['h'][2])) $Params['fr-homme-2']+=$val['h'][2]; } if(isset($val['f'])){//femme: //1er année: if(isset($val['f'][1])) $Params['fr-femme-1']+=$val['f'][1]; //2eme année: if(isset($val['f'][2])) $Params['fr-femme-2']+=$val['f'][2]; } } //Allemand: if($dim=='d'){ if(isset($val['h'])){//homme: //1er année: if(isset($val['h'][1])) $Params['de-homme-1']+=$val['h'][1]; //2eme année: if(isset($val['h'][2])) $Params['de-homme-2']+=$val['h'][2]; } if(isset($val['f'])){//femme: //1er année: if(isset($val['f'][1])) $Params['de-femme-1']+=$val['f'][1]; //2eme année: if(isset($val['f'][2])) $Params['de-femme-2']+=$val['f'][2]; } } } var_dump($Params); ?>
je sais que c'est pas bien de mettre la solution direct mais si il demande en même temps c'est qu'il ne trouve pas donc voici la solution, j'espère qu'elle te conviendra :wink: