Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/11/2011, 17h43   #1
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Par défaut [PHP-JS] Un tableau à 2 dimensions en javascript à partir d'un tableau PHP

Bonjour, je me tourne vers vous pour un problème que je rencontre, à mi-chemin entre le PHP et le javascript. Je ne sais donc pas si cette section sera plus adaptée qu'une autre ou pas, désolé d'avance si je me trompe.

Mon problème est le suivant : utilisant un module jQuery pour construire des diagrammes, je dois récupérer des valeurs contenues en base de données, pour les transformer ensuite en variable javascript de la forme
Code :
var data = [[x1,y1],[x2,y2],[x3,y3],...,[xn,yn]];
J'ai donc un tableau à 2 dimensions dans un tableau.

Pour cela je pensais construire un tableau en PHP, puis injecter ce tableau dans un tableau javascript. Mais je me perds dans le raisonnement et mes tentatives sont vaines.

J'ai utilisé le même processus pour des variables construites à partir d'un tableau en 1 dimension, qui fonctionne parfaitement, mais impossible de l'adapter. Voici le code que j'utilisais :

Code :
1
2
3
4
5
6
7
<?php while ($varNtotal = mysql_fetch_array($varStatistique)) {
	$varVisite[] = $varNtotal['col1'];
} ?>
 
<script type="text/javascript">
var data = new Array(<?php echo implode(',' ,$varVisite); ?>);
</script>
Je me retrouve bien avec une variable javascript de la forme
Code :
var data = [x1,x2,x3,...,xn];
Le problème est que si je suis la même logique et que je fais
Code :
1
2
3
4
5
6
7
<?php while ($varNtotal = mysql_fetch_array($varCotation_varStatistique)) {
	$varVisite[] = array($varNtotal['col1'], $varNtotal['col2']);
} ?>
 
<script type="text/javascript">
var data = new Array(<?php echo implode(',', $varHistorique); ?>);
</script>
Je me retrouve avec une variable javascript de la forme
Code :
var data = [x1,y1,x2,y2,x3,y3,...,xn,yn];
Une idée ? Merci d'avance.
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2011, 18h09   #2
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 671
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 671
Points : 5 404
Points : 5 404
Regarde du côté de ce code : Conversion d'un tableau PHP de dimension N en tableau JavaScript
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/12/2011, 12h06   #3
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Merci pour le lien, je n'avais pas trouvé cette information.
Mais apparemment j'obtiens le même résultat, avec une variable de cette forme
Code :
var data = [x1,y1,x2,y2,x3,y3,...,xn,yn];
...

EDIT :
C'est bon, ça fonctionne. J'ai affiché la structure de mon tableau dans javascript à partir du plugin jQuery-JSon, et j'ai vu que les valeurs étaient interprétées comme du texte, et non des chiffres.
Du coup j'ai retiré les ' dans la fonction de construction du tableau, et le résultat est exactement ce que j'attendais.

MERCI BEAUCOUP !
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 12h32   #4
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Bonjour, je me retourne vers vous de nouveau pour une amélioration sur ce code.
Je souhaite construire en gros 30 tableaux de cette façon, donc au lieu d'écrire 30 fois la ligne de construction, j'ai essayé de faire une boucle sur une variable dynamique.
Je me retrouve avec une erreur de construction du tableau, voici mon code :

AVANT (fonctionne) :
Code :
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
function construisTableauJS($tableauPHP, $nomTableauJS){
	echo $nomTableauJS." = new Array();";
	for ($i=0; $i<count($tableauPHP); $i++) {
		if (!is_array($tableauPHP[$i])) {
			echo $nomTableauJS."[".$i."] = ".$tableauPHP[$i].";";
		} else {
			construisTableauJS($tableauPHP[$i], $nomTableauJS."[".$i."]");
		}
	}
	return;
}
 
echo "<script type='text/javascript'>";
construisTableauJS($varHistorique_EBM1, "varHistorique_EBM1");
construisTableauJS($varHistorique_EBM2, "varHistorique_EBM2");
construisTableauJS($varHistorique_EBM3, "varHistorique_EBM3");
construisTableauJS($varHistorique_EBM4, "varHistorique_EBM4");
construisTableauJS($varHistorique_EBM5, "varHistorique_EBM5");
construisTableauJS($varHistorique_EBM6, "varHistorique_EBM6");
construisTableauJS($varHistorique_EBM7, "varHistorique_EBM7");
construisTableauJS($varHistorique_EBM8, "varHistorique_EBM8");
construisTableauJS($varHistorique_EOB1, "varHistorique_EOB1");
construisTableauJS($varHistorique_EOB2, "varHistorique_EOB2");
construisTableauJS($varHistorique_EOB3, "varHistorique_EOB3");
construisTableauJS($varHistorique_EOB4, "varHistorique_EOB4");
construisTableauJS($varHistorique_EOB5, "varHistorique_EOB5");
construisTableauJS($varHistorique_EOB6, "varHistorique_EOB6");
construisTableauJS($varHistorique_EOB7, "varHistorique_EOB7");
construisTableauJS($varHistorique_EOB8, "varHistorique_EOB8");
construisTableauJS($varHistorique_EMA1, "varHistorique_EMA1");
construisTableauJS($varHistorique_EMA2, "varHistorique_EMA2");
construisTableauJS($varHistorique_EMA3, "varHistorique_EMA3");
construisTableauJS($varHistorique_EMA4, "varHistorique_EMA4");
construisTableauJS($varHistorique_EMA5, "varHistorique_EMA5");
construisTableauJS($varHistorique_EMA6, "varHistorique_EMA6");
construisTableauJS($varHistorique_EMA7, "varHistorique_EMA7");
construisTableauJS($varHistorique_EMA7, "varHistorique_EMA8");
construisTableauJS($varHistorique_ECO1, "varHistorique_ECO1");
construisTableauJS($varHistorique_ECO2, "varHistorique_ECO2");
construisTableauJS($varHistorique_ECO3, "varHistorique_ECO3");
construisTableauJS($varHistorique_ECO4, "varHistorique_ECO4");
construisTableauJS($varHistorique_ECO5, "varHistorique_ECO5");
construisTableauJS($varHistorique_ECO6, "varHistorique_ECO6");
construisTableauJS($varHistorique_ECO6, "varHistorique_ECO7");
construisTableauJS($varHistorique_ECO6, "varHistorique_ECO8");
echo "</script> ";
APRES (ne fonctionne pas) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function construisTableauJS($tableauPHP, $nomTableauJS){
	echo $nomTableauJS." = new Array();";
	for ($i=0; $i<count($tableauPHP); $i++) {
		if (!is_array($tableauPHP[$i])) {
			echo $nomTableauJS."[".$i."] = ".$tableauPHP[$i].";";
		} else {
			construisTableauJS($tableauPHP[$i], $nomTableauJS."[".$i."]");
		}
	}
	return;
}
 
echo "<script type='text/javascript'>";
$varCotation = array("EBM","EOB","EMA","ECO");
foreach($varCotation as $cdt) {
	for ($x=1; $x<=8; $x++) {
		$varVar1 = "varHistorique_".$cdt.$x;
		construisTableauJS($$varVar1, $varVar1);
	}
}
echo "</script> ";
Merci d'avance.
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 13h03   #5
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 671
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 671
Points : 5 404
Points : 5 404
Hum... bêtement, tu as vérifié qu'un echo de ta variable construite donne bien ce que tu attends ?
Code :
1
2
$varVar1 = "varHistorique_".$cdt.$x;
echo $varVar1 ;
Ensuite, si on avait l'erreur exacte ça aiderait sans doute.
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 14h03   #6
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Oui la variable construite est bien celle que j'attends.

L'erreur je la vois dans la console d'erreur en faite. La page arrête de se charger au niveau de ces lignes là, et le module qui construit le diagramme à partir de ces valeurs (voir premier post) me retourne un "varHistorique_EBM1 is not defined", comme si la valeur était vide.
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 14h12   #7
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 671
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeuse PHP/Java

Informations forums :
Inscription : avril 2007
Messages : 3 671
Points : 5 404
Points : 5 404
Pour éviter les problèmes, tu peux contrôler l'existence de ta variable avant l'appel de la fonction :
Code :
1
2
3
4
$varVar1 = "varHistorique_".$cdt.$x;
if (isset($$varVar1)) {
	construisTableauJS($$varVar1, $varVar1);
}
__________________
Modératrice PHP
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)

Pour afficher votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur)
Celira est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 14h13   #8
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Bon, apparemment le problème venait du nom de la variable "varVar1", que j'avais déjà utilisé plus haut et qui faisait interférence !! Bizarre.
Quoi qu'il en soit, ça fonctionne maintenant...
Merci
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 10h58   #9
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Par défaut [PHP-JS] Un tableau à 2 dimensions en javascript à partir d'un tableau PHP en AJAX

Bonjour,

Je reviens sur mon post pour une amélioration que je tente d'apporter à mon code. Cette fois, mon tableau PHP est déclaré en AJAX dans une page appelée.
Il me faut donc envoyer par AJAX le tableau, et l'interpréter dans le javascript.

Puisque je ne peux pas faire une boucle pour construire le tableau JS, je suppose qu'il faut que j'envoie le tableau PHP "sérialisé" depuis la page AJAX, puis que je le "déserialise" dans javascript. C'est bien ça ?

EDIT :
Bon alors voici où j'en suis.
1. la page qui va interpréter le tableau en javascript et qui appelle l'AJAX :
Code :
1
2
3
4
5
6
7
$.post('inc.php',
	{ culture: num[0], echeance: num[1] },
	function(data) {
		var tableau = eval('('+data+')');
		alert(tableau);				
	}, 'json'
);
Et la page AJAX qui créé le tableau et le retourne sérialisé en JSON :
Code :
1
2
3
4
while ($varNtotal = mysql_fetch_array($varCotation)) {
	$varHistorique[] = array($varNtotal['timestamp'], $varNtotal['echeance_2');
}
echo json_encode($varHistorique);
Lorsque je fais un alert basique, je vois bien toute mes valeurs passées, sous la forme x1, x2, x3, x4. Et lorsque je fais l'éval, je n'obtiens que la dernière valeur.

Où est mon erreur ?

EDIT 2 :
Bon j'ai corrigé le tir en comprenant un peu mieux le fonctionnement. J'ai du coup trouvé une fonction de transformation qui m'a donné un résultat satisfaisant.

1. la page qui va interpréter le tableau en javascript et qui appelle l'AJAX :
Code :
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
function array2json(arr) {
	var parts = [];
	var is_list = (Object.prototype.toString.apply(arr) === '[object Array]');
	for(var key in arr) {
		var value = arr[key];
		if(typeof value == "object") {
			if(is_list) parts.push(array2json(value));
			else parts[key] = array2json(value);
		} else {
			var str = "";
			if(!is_list) str = key + ':';
			if(typeof value == "number") str += value;
			else if(value === false) str += 'false';
			else if(value === true) str += 'true';
			else str += value;
			parts.push(str);
		}
	}
	var json = parts.join(",");
	if(is_list) return '[' + json + ']';
	return '{' + json + '}';
}
 
$.post('inc.php',
	{ culture: num[0], echeance: num[1] },
	function(data) {
		var tableau = array2json(data);				
	}, 'json'
);
2. la page AJAX qui créé le tableau et le retourne sérialisé en JSON :
Code :
1
2
3
4
5
while ($varNtotal = mysql_fetch_array($varCotation)) {
	$varHistorique[] = array($varNtotal['timestamp'], $varNtotal['echeance_2']);
}
 
echo json_encode($varHistorique);
Et ça tourne !
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h52.


 
 
 
 
Partenaires

Hébergement Web