CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Highcharts (Javascript/PHP) : help me !

Cisla57
Cisla57
Niveau 10
19 février 2015 à 20:50:38

Je vais essayer d'être le plus bref et le plus précis possible.

Highcharts est une librairie Javascript/AJAX permettant de faire de beaux graphiques interactifs.

La librairie propose un graphique de ce genre et c'est exactement ce qu'il me faut :
https://image.noelshack.com/fichiers/2015/08/1424292762-example-highcharts-graph.png

Voici ce que je veux :

dans l'axe des X, je veux afficher les mois. Ces mois doivent être issus de ma base de données.
Pour chaque nouvelle entrée dans ma table, j'y associe une date. Et c'est simple de récupérer le mois de la date dans la requête SQL.

dans l'axe des Y, je veux afficher des chiffres.

Voici ma table :

id | type | montant| date

et des exemples d'entrée :

1 | type1 | 100 | 2014-11-01

2 | type1 | 40| 2014-11-21

3 | type3 | 60 | 2014-11-23

4 | type2 | 150 | 2014-11-24

5 | type1 | 60 | 2014-11-30

6 | type1 | 200 | 2014-12-01

7 | type2 | 50 | 2014-12-21

8 | type3 | 150 | 2014-12-23

9 | type1 | 100 | 2014-12-24

10 | type2 | 500 | 2014-12-25

11 | type3 | 150 | 2014-12-28

Rien de difficile. J'ai 3 types d'entrée. Chaque entrée contient un montant.

Mon graphique devra être un total du montant de chaque type pour chaque mois (facile à faire en SQL mais je suis bloqué ensuite)

La difficulté commence ici. Voici comment il faut mettre en forme les données pour Highcharts (données de l'image ci-dessus) :

L'axe des X :


xAxis: {

categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]

},

J'ai réussi à faire l'axe des X mais je bloque au terrible axe des Y :

L'axe des Y :


yAxis: {

series: [{

name: 'Tokyo',
data: [7.0, 6.9,]
}, {

name: 'New York',
data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]
}, {

name: 'Berlin',
data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
}, {

name: 'London',
data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]

}] 
});

Si les données ne respectent pas cette syntaxe exacte, c'est mort : mon graphique ne pourra pas fonctionner.

Voici ma requête SQL me permettant d'additionner les montants pour chaque type et chaque mois

SELECT type, SUM(montant) AS somme, MONTH( date) AS mois FROM  `matable` 	GROUP BY  mois, type.

Elle m'affiche ce résultat :

type - somme - mois
type 1 - 200 - 11
type2 - 150 - 11
type3 - 60 -  11
type 1 - 300 - 12
type2 - 550 - 12
type3 - 300 - 12

Avec PHP, je pioche et je mets en forme comme ça :

while($data = $requete->fetch()) {
   echo "{name: '".$data['type']."',";
   echo "data: [".$data['somme'].", ]}, ";
}

Ce qui me donne ce résultat ci :

{name: 'type1',
data: [200, ]},

{name: 'type2',
data: [150, ]},

{name: 'type3',
data: [60, ]},

{name: 'type1',
data: [300, ]},

{name: 'type2',
data: [550, ]},

{name: 'type3',
data: [300, ]},

alors que j'aimerais avoir ce résultat :

{name: 'type1',
data: [200, 300 ]},

{name: 'type2',
data: [150, 550 ]},

{name: 'type3',
data: [60, 300 ]},

Et je bloque, et je bloque, et je bloque....

Message édité le 19 février 2015 à 20:53:11 par Cisla57
Popovitch
Popovitch
Niveau 26
19 février 2015 à 20:59:23

Jeune fou... les tableaux, les objets et json_encode sont tes amis :ok:

Cisla57
Cisla57
Niveau 10
19 février 2015 à 21:04:13

Oula oula ça fait peur :hap: Je suis zéro en POO :peur:

peux-tu être plus précis?

Message édité le 19 février 2015 à 21:04:58 par Cisla57
Popovitch
Popovitch
Niveau 26
19 février 2015 à 21:23:27

Pas de POO ici t'inquiète pas... De simples objets avec des attributs (pour faire simple : une autre représentation d'un tableau) :ok:

L'idée c'est de commencer par regrouper les données qui portent le même nom dans différents tableaux



$donnees = array();
while($data = $requete->fetch()) {
	// Init d'un nouvel objet pour le type si besoin
	if(!isset($donnees[$data['type']]){
		$donnees[$data['type']] = new stdClass; 
		$donnees[$data['type']]->name = $data['type'];
		$donnees[$data['type']]->data = array();
	}
	
	// Ajout de la somme au tableau de donnée
	$donnees[$data['type']]->data[] = $data['somme'];
}

Ici tu devrais donc avoir quelque chose comme ça


$donnees = [
	'Paris' : {
		'name': 'Paris',
		'data': [12, 231, 54]
	},
	'New York' : {
		'name': 'New York',
		'data': [564, 321, 542,8451]
	},
	...
]

Ce qui est a peu près ce que tu veux (et oui...). Le seul truc qui va poser problème sont les clés 'Paris' et 'New York' que tu vas simplement virer en faisant


$donnees =  array_values($donnees);

Et enfin un simple json_encode pour avoir ce que tu veux :hap:


$resultat =  json_encode($donnees);

Ça risque d'être compliqué à comprendre si tu n'as jamais fait ce genre de représentation de données, si t'as des questions n'hésite pas :ok:

Message édité le 19 février 2015 à 21:25:25 par Popovitch
Cisla57
Cisla57
Niveau 10
19 février 2015 à 22:35:26

Purée... merci.

Pour être honnête j'ai pas compris grand chose à ton raisonnement, mais c'est dû à mon très faible niveau en programmation (marre d'avoir l'impression de ne pas faire de progrès :-( ).

Mais par contre toi tu maîtrises à la perfection et ça se voit.

Par contre, petit soucis : j'ai des guillemets autour des chiffres dans data et du coup ça ne fonctionne pas.

Encore merci, je suis à la fois content et déprimé. :hap:

Popovitch
Popovitch
Niveau 26
20 février 2015 à 09:18:43

Si tu as des guillemets autour des chiffres cela signifie que celui-ci est considéré comme une chaine de caractère et non comme des entiers / décimaux (ce que tu veux).

Pour corriger ça tu modifies simplement cette ligne :
$donnees[$data['type']]->data[] = $data['somme'];
que tu remplaces par :
$donnees[$data['type']]->data[] = (float) $data['somme'];

Float va simplement forcer ta somme à se comporter comme un nombre décimal :ok:

Cisla57
Cisla57
Niveau 10
20 février 2015 à 11:32:23

Merci, merci mille fois.

C'est clair et net que je n'aurais jamais réussi sans toi. Ca fonctionne enfin... :snif:

Merci encore l'ami.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment