Discussion:
Trop de boucle ?
(trop ancien pour répondre)
geo75
2006-12-14 06:54:47 UTC
Permalink
Bonjour,

J'ai un quantité de boucle qui marche bien. Mais je ne suis pas
certains que c'est une bonne facon de faire.

foreach ($val as $cle1 => $val2) {
foreach ($val2 as $cle2 => $val3) {
foreach ($val3 as $cle3 => $val4) {
foreach ($val4 as $cle4 => $val5) {
print $cle4 . "=" . $val5;
echo "</pre><hr/>";
}
}
}
}
}

Si vous avez des idées autres, je suis preneur.
Merci d'avance
Olivier Miakinen
2006-12-14 09:24:47 UTC
Permalink
Post by geo75
J'ai un quantité de boucle qui marche bien. Mais je ne suis pas
certains que c'est une bonne facon de faire.
foreach ($val as $cle1 => $val2) {
foreach ($val2 as $cle2 => $val3) {
foreach ($val3 as $cle3 => $val4) {
foreach ($val4 as $cle4 => $val5) {
(il doit manquer du code ici : accolade ouvrante et balise ouvrante)
Post by geo75
print $cle4 . "=" . $val5;
echo "</pre><hr/>";
}
}
}
}
}
Si ton tableau est vraiment à quatre niveaux comme ça, cette façon de
faire me semble la plus naturelle.

Tu voudrais le mettre à plat d'abord, puisque seules les valeurs du
niveau 4 t'intéressent ? Si oui, c'est peut-être que le tableau lui-même
était mal conçu au départ ? En tout cas, sans plus d'infos sur ce que
c'est et ce que ça fait, on ne peut pas de donner de conseils vraiment
pertinents.
Post by geo75
Si vous avez des idées autres, je suis preneur.
Le seul truc, c'est que puisque tu n'utilises pas les clés des niveaux
1, 2 et 3, autant ne pas les affecter à des variables :

foreach ($val as $val2) {
foreach ($val2 as $val3) {
foreach ($val3 as $val4) {
foreach ($val4 as $cle4 => $val5) {
print $cle4 . "=" . $val5;
echo "</pre><hr/>";
}
}
}
}
}
geo75
2006-12-14 13:20:36 UTC
Permalink
Genial, merci Oliver. Le tableau est fournit par un web service SOAP,
et je n'ai aucune possibilité de le modifier. Meme si la construction
me parait mal pensé aussi. Mais bon je ne suis pas assez competent
pour critiquer.

Array
(
[dimension1] => Array
(
[dimension2] => Array
(
[0] => Array (
[champ1] => valeur1
[champ2] => valeur2
)

[1] => Array (
[champ1] => valeur1
[champ2] => valeur2
)
...etc...
Vincent Lascaux
2006-12-17 09:40:34 UTC
Permalink
Post by geo75
Genial, merci Oliver. Le tableau est fournit par un web service SOAP,
et je n'ai aucune possibilité de le modifier. Meme si la construction
me parait mal pensé aussi. Mais bon je ne suis pas assez competent
pour critiquer.
Les dimensions 1 et 2 ont probablement un sens. Dans ce cas, il faudrait
voir si c'est pas plus simple de :
- faire de la récursivité (imaginons que ton tableau corresponde à une
hierarchie de fichiers où les dimensions sont des dossiers, la double boucle
semble moins naturelle qu'une fonction qui cherche les fichiers de façon
récursive)
- faire plusieurs fonctions, une pour chaque dimension (imaginons que le
tableau soit une représentation de personnes dans des villes, dans des pays,
il me semblerait plus compréhensible d'avoir des fonctions AffichePersonne,
AfficheVille, AffichePays, AfficheContinent... AfficheContinent serait la
premiere boucle qui se contenterait d'appeler AffichePays, qui serait une
boucle qui appellerait AfficheVille... Ca change pas le fait que tu as des
boucles imbriquées, c'est juste plus lisible)
--
Vincent
geo75
2006-12-17 13:26:18 UTC
Permalink
Post by Vincent Lascaux
Vincent
Bonjour,

J'ai cherché plusieurs solutions dont celle de la fonction recursive
qui permet un code plus clair, mais voila quelques soit le code, la
valeur qui m'est retourné est le premier caractere de chaque valeurs.

function afficher_tableau($tableau) {
foreach ($tableau as $cle => $valeur) {
if (is_array($valeur)) {
afficher_tableau($valeur);
}
else {
echo $valeur['Telephone'].' <br>';
}
}
}

Dans cette expleme $valeur['Telephone'] me retourne que les premiers
chiffres.
Quelque chose a du m'echappter, mais je ne sais pas quoi.
geo75
2006-12-17 19:09:33 UTC
Permalink
Je viens de voir l'erreur, et j'ai corrigé.
cependant j'ai un autre probleme.

<?php
# Tableau récursif
function afficher_tableau($tableau) {
foreach ($tableau as $cle => $valeur) {
if (is_array($valeur)) {
afficher_tableau ($valeur);
} else {
$champs[] = $cle;
$data[] = $valeur;
}
}
$query = 'INSERT INTO maTable (' . implode(',', $champs). ')
VALUES (' . implode(',', $data). ')';
return $query;
}
# requete
$requete1 = array (
toto,
tata,
titi,
array ( dada, didi, dodo ),
array ( jaja, jiji, jojo )
);
afficher_tableau ($requete1);
?>

Le probleme c'est que j'ai trois fois INSERT INTO

INSERT INTO maTable (0,1,2) VALUES (dada,didi,dodo)INSERT INTO maTable
(0,1,2) VALUES (jaja,jiji,jojo)INSERT INTO maTable (0,1,2) VALUES
(toto,tata,titi).

Au lieu d'en avoir une seule.
Olivier Miakinen
2006-12-17 21:32:41 UTC
Permalink
Post by geo75
<?php
# Tableau récursif
function afficher_tableau($tableau) {
foreach ($tableau as $cle => $valeur) {
[...]
afficher_tableau ($valeur);
[...]
}
$query = 'INSERT INTO maTable (' . implode(',', $champs). ')
VALUES (' . implode(',', $data). ')';
return $query;
}
Il n'y a pas que ton tableau qui est récursif : lorsque afficher_tableau
s'appelle elle-même, cela rajoute un INSERT INTO à chaque coup.
Post by geo75
Le probleme c'est que j'ai trois fois INSERT INTO
[...]
Au lieu d'en avoir une seule.
Ben oui. Tu devrais peut-être séparer d'une part la récupération des
valeurs $champs et $data (que tu peux faire de façon récursive) et
d'autre part l'écriture de la requête (à faire une seule fois à la fin).
Gromitt
2006-12-14 21:36:53 UTC
Permalink
Post by geo75
Bonjour,
J'ai un quantité de boucle qui marche bien. Mais je ne suis pas
certains que c'est une bonne facon de faire.
foreach ($val as $cle1 => $val2) {
foreach ($val2 as $cle2 => $val3) {
foreach ($val3 as $cle3 => $val4) {
foreach ($val4 as $cle4 => $val5) {
print $cle4 . "=" . $val5;
echo "</pre><hr/>";
}
}
}
}
}
Si vous avez des idées autres, je suis preneur.
Merci d'avance
Salut,

si le format des données l'autorise, tu peux toujours faire quelque
chose de récursif (mais c'est plus du domaine de l'exercice de style
qu'autre chose) :

function recursive_output($content, $key = '') {
if (!is_array($content)) {
echo '<pre>'.$key.'='.strval($content).'</pre>';
return;
}
foreach ($content as $key => $subContent) {
recursive_output($subContent, $key);
}
}

// utilisation
$a = array(array(array(array(array(1, 2, 3), array(3, 4, 5)))));
recursive_output($a);
Continuer la lecture sur narkive:
Loading...