Page 1 sur 1

Somme tableau mutlidimensionnel

Posté : 01 déc. 2015, 00:35
par chanezb
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

Re: Somme tableau mutlidimensionnel

Posté : 01 déc. 2015, 11:02
par @rthur
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.

Re: Somme tableau mutlidimensionnel

Posté : 02 déc. 2015, 08:27
par chanezb
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.

Re: Somme tableau mutlidimensionnel

Posté : 02 déc. 2015, 11:09
par Spols
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"

Re: Somme tableau mutlidimensionnel

Posté : 02 déc. 2015, 11:19
par @rthur
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 ^^

Re: Somme tableau mutlidimensionnel

Posté : 07 déc. 2015, 16:31
par two3d
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: