Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
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 05/05/2008, 09h23   #1
Invité régulier
 
Inscription : janvier 2005
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 27
Points : 9
Points : 9
Par défaut [Tableaux] Modifier array

Bonjour,
J'ai un array qui se présente comme cela:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
0 :
 
      0 = 10
      1 = 20
      2 = 40
      3 = 30
 
1 :
 
      0 = 50
      1 = 30
      2 = 10
      3 = 20
Je souhaite modifier ce tableau pour ajouter la valeur contenue a l'indice n celle de n-1 (sauf pour la première case du tableau bien sur).
Ainsi mon tableau serait:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
0 :
 
      0 = 10
      1 = 30 // (10+20)
      2 = 70 // (40+30)
      3 = 100 // (70+30)
 
1 :
 
      0 = 50
      1 = 80 // (50+30)
      2 = 90 // (80+10)
      3 = 110 // (90+20)
J'ai codé cette fonction récursive:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
function modifier_tableau($tableau) {
	$i=0;
	foreach ($tableau as $cle=>$valeur) {
		if(is_array($valeur)) {
			modifier_tableau($valeur);
		} else {
			if($i!=0){
				$tableau[$i] = $tableau[$i]+$tableau[$i-1];
				echo $i.' => '.$tableau[$i].'<br />';
				$i+=1;
			} else {
				echo $i.' => '.$tableau[$i].'<br />';
				$i+=1;
			}
		}
	}
}
Cela m'affiche bien:
Code :
1
2
3
4
5
6
7
8
9
 
0 => 10
1 => 30
2 => 70
3 => 100
0 => 50
1 => 80
2 => 90
3 => 110
Mais au final le tableau que j'ai passé en paramètre n'a pas été modifié (bien que je l'ai déclaré: global $array; )

Avez vous une idée de comment je dois m'y prendre SVP?

Merci d'avance,
Ganok.
ganok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 09h51   #2
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 45
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : juin 2006
Messages : 45
Points : 36
Points : 36
Renseigne toi sur la portée des variables avec une recherche sur ton moteur préféré.

Si tu veux que ton tableau soit modifié, passe le par référence à ta fonction. (Ce n'est pas la seule solution, mais je te laisse un peu chercher, car ton problème, c'est la base de la programmation et je ne ferai pas mieux qu'un bon cours en ligne )
George Abidbol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 09h58   #3
Invité régulier
 
Inscription : janvier 2005
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 27
Points : 9
Points : 9
Citation:
Envoyé par George Abidbol Voir le message
Renseigne toi sur la portée des variables avec une recherche sur ton moteur préféré.

Si tu veux que ton tableau soit modifié, passe le par référence à ta fonction. (Ce n'est pas la seule solution, mais je te laisse un peu chercher, car ton problème, c'est la base de la programmation et je ne ferai pas mieux qu'un bon cours en ligne )

J'ai bien sur essayer le passage par référence ( function modifier_tableau(&$tableau) ) ainsi que la déclaration de mon tableau en variable globale mais rien n'y fait.
ganok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 10h56   #4
Invité régulier
 
Inscription : janvier 2005
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 27
Points : 9
Points : 9
Je pense que c'est la récursivité qui fait planter donc si vous pensez avoir une solution ou si vous voyez comment faire plus simple je suis preneur.

Merci.
ganok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 13h18   #5
Nouveau Membre du Club
 
Inscription : juin 2006
Messages : 45
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : juin 2006
Messages : 45
Points : 36
Points : 36
Effectivement, passer par référence comme tu le faisais (et comme moi aussi je le faisais jusqu'à maintenant) ça ne passe pas sur les tableaux en PHP5, mais sur les objets, oui.

CF :
passage de tableau par reference

Voilà la solution :

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
 
$tableau = new ArrayObject();
$tableau[0] = new ArrayObject();
$tableau[0]->append(10);
$tableau[0]->append(20);
$tableau[0]->append(40);
$tableau[0]->append(30);
 
$tableau[1] = new ArrayObject();
$tableau[1]->append(50);
$tableau[1]->append(30);
$tableau[1]->append(10);
$tableau[1]->append(20);
 
print_r($tableau);
echo '<br>';
modifier_tableau($tableau);
print_r($tableau);
 
function modifier_tableau(&$tableau) {
	$i=0;
	foreach ($tableau as $valeur) {
		if(is_object($valeur)) {
			modifier_tableau($valeur);
		} else {
			if($i!=0){
				$tableau[$i] = $tableau[$i]+$tableau[$i-1];
				$i+=1;
			} else {
				$i+=1;
			}
		}
	}
}
Ca affiche bien :

Code :
1
2
ArrayObject Object ( [0] => ArrayObject Object ( [0] => 10 [1] => 20 [2] => 40 [3] => 30 ) [1] => ArrayObject Object ( [0] => 50 [1] => 30 [2] => 10 [3] => 20 ) )
ArrayObject Object ( [0] => ArrayObject Object ( [0] => 10 [1] => 30 [2] => 70 [3] => 100 ) [1] => ArrayObject Object ( [0] => 50 [1] => 80 [2] => 90 [3] => 110 ) )
J'ai encore appris un truc aujourd'hui, merci
George Abidbol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2008, 13h58   #6
Modératrice
 
Avatar de Celira
 
Femme
Développeuse PHP/Java
Inscription : avril 2007
Messages : 3 686
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 686
Points : 5 453
Points : 5 453
Sinon il y a beaucoup plus simple que de se prendre la tête avec la portée des variables : renvoyer le tableau comme résultat de la fonction
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function modifier_tableau($tableau) {
	foreach ($tableau as $cle=>$valeur) {
		if(is_array($valeur)) {
			$tableau[$cle] = modifier_tableau($valeur);
		} else {
			if($cle!=0){
				$tableau[$cle] = $tableau[$cle]+$tableau[$cle-1];
				echo $cle.' => '.$tableau[$cle].'<br />';
			} else {
				echo $cle.' => '.$tableau[$cle].'<br />';
			}
		}
	}
   return $tableau ;
}
et tu récupères le résultat par
Code :
$mon_tableau = modifier_tableau($mon_tableau);
__________________
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 05/05/2008, 14h13   #7
Invité régulier
 
Inscription : janvier 2005
Messages : 27
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 27
Points : 9
Points : 9
Citation:
Envoyé par Celira Voir le message
Sinon il y a beaucoup plus simple que de se prendre la tête avec la portée des variables : renvoyer le tableau comme résultat de la fonction
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function modifier_tableau($tableau) {
	foreach ($tableau as $cle=>$valeur) {
		if(is_array($valeur)) {
			$tableau[$cle] = modifier_tableau($valeur);
		} else {
			if($cle!=0){
				$tableau[$cle] = $tableau[$cle]+$tableau[$cle-1];
				echo $cle.' => '.$tableau[$cle].'<br />';
			} else {
				echo $cle.' => '.$tableau[$cle].'<br />';
			}
		}
	}
   return $tableau ;
}
et tu récupères le résultat par
Code :
$mon_tableau = modifier_tableau($mon_tableau);
Effectivement ça marche, le pire c'est que j'avais essayer cette solution au tout début et ça n'avait pas fonctionné (probablement une erreur de syntaxe quelque part...)
Merci beaucoup à vous deux, problème résolu.
ganok 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 00h47.


 
 
 
 
Partenaires

Hébergement Web