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 :

Compter les valeurs d'un tableau entre des intervalles


Sujet :

Langage PHP

  1. #1
    Membre du Club Avatar de popoliline
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 88
    Points : 62
    Points
    62
    Par défaut Compter les valeurs d'un tableau entre des intervalles
    Bonsoir à tous,

    J'ai un fichier xml de valeurs que j'utilise pour faire des traitements statistiques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <valeurs>
    <value>1</value>
    <value>1.1</value>
    <value>1</value>
    <value>2</value>
    <value>2.1</value>
    <value>1.4</value>
    <value>4</value>
    <value>4.1</value>
    <value>2</value>
    <value>2</value>
    </valeurs>
    à partir de ce fichier, je récupère un tableau de valeurs $data[1] en utilisant un preg_match_all, ca c'est bon

    Ce que je voudrais faire c'est compter les valeurs du tableau comprises entre des bornes (min et max) -> en fait c'est faire un tableau de fréquences pour ensuite en faire un graphique


    Donc si ma réflexion est bonne, je souhaiterais en faite faire l'équivalent de ce type de requête SQL dans une boucle if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Count ($data[i]) From MaTable WHERE $data[i] > $intervalle_bas AND $data[i] < $intervalle_haut
    pour le moment j'ai récupérer mes valeurs que je trie par ordre croissant
    Ensuite je calcule l'écart de l'intervalle ($ecart) pour récupérer chaque bornes (basse "ib" et haute "ih") des intervalles.

    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
     
    $barres = 4;
    sort ($data[1]);
    $data_min = min($data[1]);
    $data_max= max($data[1]);
     
    //Découpage intervalles selon nb. de barres
    	$ecart = floatval(($data_max - $data_min) / $barres);
    	$intervalles = array();
     
    for ($it = ($data_min + $ecart); $it <= ($data_max + $ecart) + 1; $it = $it + $ecart) {
    		$intervalles[] = $it;
    		print $it;
    	}
     
    for ($i = 0; $i <= $barres; $i++) {
    		$ib = $intervalles[$i] - $ecart;
    		$ih = $intervalles[$i];
    		echo "<!-- ib pour i=".$i." : ".$ib."-->\n";
    		echo "<!-- ih pour i=".$i." : ".$ih."-->\n";
    	}
    résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <!-- ib pour i=0 : 1-->
    <!-- ih pour i=0 : 1.775-->
    <!-- ib pour i=1 : 1.775-->
    <!-- ih pour i=1 : 2.55-->
    <!-- ib pour i=2 : 2.55-->
    <!-- ih pour i=2 : 3.325-->
    <!-- ib pour i=3 : 3.325-->
    <!-- ih pour i=3 : 4.1-->
    <!-- ib pour i=4 : 4.1-->
    <!-- ih pour i=4 : 4.875-->
    ce que je voudrais obtenir c'est, si possible, un tableau à 2 colonnes (borne haute et effectif) de ce genre (désolé pour la syntaxe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1.775 , 4
    2.55  , 4
    3.325 , 0
    4.1  , 1
    4.875 , 1
    mais là je bloque, je ne sais pas trop comment faire dans ma boucle pour compter le nombres de valeurs comprises entre $ib[i] et $ih[i] ...

    Il y aurait peut être la fonction array_filter() à adapter mais je ne vois pas trop comment l'utiliser
    Après je ne veux pas filtrer mes données, ce qui m'intéresse c'est vraiment de compter les valeurs comprises dans un intervalle...

    une idée ? une piste pour m'aider ?
    Merci beaucoup

  2. #2
    Membre du Club Avatar de popoliline
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 88
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Bon ben apparemment mon sujet n'inspire absolument pas les foules dommage pour moi
    Finalement après y avoir consacré un long moment, j'ai trouvé une solution. Certes pas du tout optimale à mon avis mais qui à l'air de fonctionner ...
    Il faut encore que je fasse encore quelques tests pour voir si je prends en compte des cas "particuliers"

    Je mets le bout de code concerné si ca intéresse des gens.

    Par contre, pourriez vous me dire si ce que j'ai fait pourrez être optimisé car ce n'est qu'une partie du traitement et cela met déjà un peu trop de temps à se faire je trouve ...

    Bonne journée à tous

    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
     
    //création des variables $bars et $fcumulees avec mise en forme pour création du graphique --> diagramme de fréquence 
    	$barres = 40;
    	sort ($data[1]);                                     //Trie le tableau de données
    	print_r ($data[1]);
     
    //Découpage intervalles selon nb. de barres
    	$ecart = floatval(($data_max - $data_min) / $barres);
    	$intervalles = array();
     
    	for ($it = ($data_min + $ecart); $it <= ($data_max + $ecart) + 1; $it = $it + $ecart) {
    		$intervalles[] = $it;
    	}
     
    //Comptage des individus dans les intervalles
    	$frequences = array();
    	$libCourt = array();
    	$nbval = count ($data[1]);
    	$nbval = intval ($nbval);
    	$data = $data[1];
    	$c = 0;
    	$fCumul = array();
     
     
    	for ($i = 0; $i <= $barres; $i++) {
    		$ib = $intervalles[$i] - $ecart;
    		$ih = $intervalles[$i];
    		echo "<!-- ib pour i=".$i." : ".$ib."-->\n";
    		echo "<!-- ih pour i=".$i." : ".$ih."-->\n";
     
    		$libCourt[$i] = strval(round($intervalles[$i],2));         // récupére les intervalles hauts arrondis 
    		$compte = 0;
     
    		$depart = 0;
    		while ($data[$depart] <= $ib && $depart < $nbval) {
    			$depart += 1;
    		}
    		$j = $depart;
    		echo "<!-- Depart : ".$depart."-->\n";
    		$depasse = false;
    		while ($depasse == false) {
    			if($data[$j] >= $ib AND $data[$j] <= $ih ){
    				$compte = $compte + 1;
    				$j = $j + 1;
    			}
    			if (($data[$j] > $ih) || $j >= $nbval) {
    				$depasse = true;
    			}
    		}
    		echo "<!-- compte pour i=".$i." : ".$compte."-->\n";
    		echo "<!-- nombre de valeur" .$nbval. "-->\n";
     
    		$frequences[$i] = $compte;
    		$c = $c + ($compte / $nbval) * 100;
    		$fCumul[$i] = round($c, 2);                //retourne la valeur arrondie
    	}
    			print_r ($libCourt);
    			print_r ($frequences);
    			print_r ($fCumul);

  3. #3
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    Je pense que la fonction 'array_count_values()' va alléger ton code ...

    Sinon, en regardant ton algorithme, je ne comprends pas pourquoi tu créés un tableau $intervalles avec des bornes calculées (avec $ecart, min, max) et puis dans ta boucle, tu recalcules les intervalles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		$ib = $intervalles[$i] - $ecart;
    		$ih = $intervalles[$i];
    Tout peut se faire en 1 coup
    Je te parle là de l'optimisation, mais regardes déjà la fonction que je t'ai donnée parceque celle ci suivie d'un tri avancera bien ton projet.
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  4. #4
    Membre du Club Avatar de popoliline
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 88
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Désolé Fench de la réponse ultra tardive.
    J'ai effectivement regardé la fonction dont tu parles et je l'ai utilisé.
    Concernant ce problème, il a fait parti d'un projet étudiant à réaliser en de très courts termes, donc vu que le code fonctionnait tel qu'il était j'avoue ne pas avoir pris de temps pour trop le modifier et l'optimiser comme je l'aurais voulu...
    Donc encore merci de l'intérêt porté à cette question.

    Pour les personnes intéressées par le projet, cette question était en lien avec celle-ci : jQuery - Flot Grpahique et classe d'individus

    Encore merci et bonne fin de journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/08/2014, 12h54
  2. [MySQL] Afficher les valeurs d'un tableau pour des cases à cocher
    Par tiesto95 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/12/2008, 16h45
  3. [Tableaux] Compter les valeurs d'un tableau
    Par jbxlr dans le forum Langage
    Réponses: 2
    Dernier message: 19/12/2008, 17h40
  4. Remplacement des espaces dans les valeur d'un tableau
    Par calimero642 dans le forum Langage
    Réponses: 10
    Dernier message: 12/05/2006, 18h56
  5. Compter les valeurs d'un tableau
    Par leeloo076 dans le forum ASP
    Réponses: 6
    Dernier message: 30/03/2004, 13h29

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