Gestion d'indices de tableaux

[Résolu]
Signaler
Messages postés
126
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
16 octobre 2010
-
Messages postés
126
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
16 octobre 2010
-
Bonjour!
voici un exemple de tableau :
$Liste1[0]= Array(132,1);
$Liste1[1]= Array(516,1);
$Liste1[2]= Array(891,1);
Lorsque je fais:
$Indice="0";
echo $Liste1[$Indice];
j'ai "Array" qui s'affiche : c'est normal !!!
Sauf que si je veux faire un truc du style :
$Indice="0[0]";
ou
$Indice="[0][0]";
alors là il me plante mon echo $Liste1[$Indice] alors que je voudrais voir 132 d'afficher.
Comment faire pour passer les indices d'un tableau numérique dans ma variable?
Merci de votre réponse.
A bientôt.

32 réponses

Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
8
Salut,





Tu fais des tableau en 2D. Donc il faudrait indexer le tableau avec deux indices... (et non un seul !)



mais tu peux te débrouiller ainsi :

<?php



$Liste1[0]= Array(132,1);

$Liste1[1]= Array(516,1);

$Liste1[2]= Array(891,1);


$indice = "[0][0]";

eval("echo \$Liste1$indice;");



?>



Par contre, je trouve que ce que tu fais n'est pas très... propre.





A+ et beaux nénés
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Salut,

Je ne pige pas ce que tu veux faire.

Je te propose plusieurs solutions :

$indice = '0,0'; // par exemple hein
$tmp = explode (',', $indice);
echo $Liste1[$tmp[0]][$tmp[1]];

$indice1 = '0';
$indice2 = '0';
echo $Liste1[$indice1][$indice2];

ou directement :
$indices = array (0, 0);
echo $Liste1[$tmp[0]][$tmp[1]];
tu peux ainsi changer les indices facilement :
$indice[1] = 1;
echo $Liste1[$tmp[0]][$tmp[1]]; // va afficher 1
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
J'avais pas pensé au eval () tien :-)
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
8
T'avais pas pensé à eval... Ben c'est pas un mal ;)

Ce eval est une source d'emmerdes. In-debuggable !!



Franchement, je trouve tes solutions beaucoup plus acceptables surtout :

$indices = array (0, 0);

echo $Liste1[$indices[0]][$indices[1]];
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
Salut,

Mais pourquoi vous vous obtinnez à mettre des guillemets ????



$liste=array();

$Liste1[0]= Array(132,1);

$Liste1[1]= Array(516,1);

$Liste1[2]= Array(891,1);



peut être remaplcé par :




$liste=array();


$Liste1[]= Array(132,1);


$Liste1[]= Array(516,1);


$Liste1[]= Array(891,1);



ou encore :





$liste=array(

array(132,1),

array(516,1),

array(891,1));





echo $Liste1[0][0];



ICI ON MET DES INT !!!! pas des strings !!!



$indice1=0;

$indice2=0;



ou echo $Liste1[$indice1][$indice2];






In a dream, I saw me, drop dead... U was there, U cried... It was just a dream, if I die, U won't cry, maybe, U'll be happy

Mon site (articles sur la programmation et programmes)
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
9
Yep c'est beaucoup mieux :-)

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
Salut,

Je vais lancer un site :



http://www.codes-php-comme-un-porc.com



et j'y mettrais tout les codes qu'on trouve sur le forum et qui sont dégeu...

In a dream, I saw me, drop dead... U was there, U cried... It was just a dream, if I die, U won't cry, maybe, U'll be happy

Mon site (articles sur la programmation et programmes)
Messages postés
126
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
16 octobre 2010

Merci à tous pour cette spontanéité!
Pour toi coucou747, tu dis :
echo $Liste1[0][0]
ICI ON MET DES INT !!!! pas des strings !!!

Et bien justement, en réalité j'ai pas tout dit mais en fait j'ai créé une fonction qui va rechercher dans des tableaux de tableaux de tableaux ... et qui retourne le chemin de l'indice où se trouve la valeur cherchée.
Voilà le prototype de ma fonction :
function RechercheValeurTableau($Tableau,$Valeur)
Ma variable $Tableau peut contenir d'autres tableaux dans ce tableau comme :
$Liste1[0]= Array(Array(132,1),Array(3),23);
$Liste1[1]= Array(Array( 516 ,1),Array(8),64);
$Liste1[2] = Array(Array(891,1),Array(6),56);
Là comme tu vois y'a des tableaux dans des tableaux.
Donc quand je fait par exemple :
$Indice=RechercheValeurTableau($Liste1,516)
la valeur de $Indice est "[1][0][0]".
Après je veux faire :
echo $Liste1[$Indice] mais ca plante.
Voilà tu sais tout sur "pourquoi c'est en string" et c'est pourquoi j'ai posté. Je n'arrive pas à passé des paramètres string
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Heu,

Ok, j'aurais dû mettre $indice1 = 0, mais j'étais parti sur ses exemples, simplement. ceci dit, je suis aussi parti du principe que je ne savais pas comment il allait utiliser ceci (d'où les différents exemples).
Parce que si ce sera
$indice1 = $_POST['indice1']; // perso j'utiliserais directement le post, avec un check sur son type
ça ne change pas grand chose. Le but était juste de lui montrer comment il pouvait faire, pas de lui dire ce qu'il allait en faire...
Quant à la façon de construire le tableau...je ne vois pas le problème ? Tout dépend encore une fois de l'utilisation dans le script.

En fait, si on doit aller dans la "bonne programmation" à chaque explication, je serais tenté de dire que c'est mal codé, ton truc, Coucou... ;-) :

$indice1 = 0;
$indice2 = 0;
// code

if (isset ($Liste1) && is_array ($Liste1) && isset ($indice1) && is_int ($indice1) && isset ($indice2) && is_int ($indice2)) {
if (isset ($Liste1[$indice1][$indice2])) { // faudrait pas dépasser la pile...;-)
echo $Liste1[$indice1][$indice2];
}
}

Et encore, je suis sûr que j'oublie des trucs...(on pourrait raccourcir hein, mais j'ai fait long exprès).

De toutes façons, comme J_G, je trouve la façon de faire crade. Il est curieux d'accéder à un tableau comme ça.
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
Salut,

dans ce cas :



->$$


$Indice ='liste'.$Indice ;


echo $$indice;



et comme ça ? c'est propre ?


In a dream, I saw me, drop dead... U was there, U cried... It was just a dream, if I die, U won't cry, maybe, U'll be happy

Mon site (articles sur la programmation et programmes)
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
8
N'y aurait'il pas une légère nostalgie de l'époque C++ ante-stdlib dans vos remarques ?



Aah, c'était le bon temps... ces tableaux pas dynamiques pour un sous,
ces malloc infernaux, ces buffers qui s'empétraient, se
cheveauchaient...



Moi aussi, défois, je me dis que de ne plus utiliser le trans-typage, c'est un luxe indécent.
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
8
t'as essayé avant ?



<?php

$liste = "Liste1";

$indice = "[0][0]";



echo ${$liste.$indice};

?>



Notice : undefine variable Liste1[0][0]...
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
8
echo $"$liste$indice";







Si vous n'aimez pas cette façon d'ecrire.... criez fort ;)
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Coucou => ça marche pas (j'avais déjà essayé dans les solutions que je voulais lui proposer); ou alors je me suis mal débrouillé (c'est encore possible). De toutes façons, c'est crade aussi les variables variables ;-) Presqu'autant qu'ujn eval () ;-)

J_G => Non. Lol.

pcman => fais renvoyer un tableau contenant les indices, par ta fonction. Puis tu parcours ce tableau pour réafficher la valeur, voilà tout.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
echo $"$liste$indice";

Ca marche, CA ? lol...burk...
Messages postés
126
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
16 octobre 2010

j'aime bien le eval proposé par J_G.
Par contre c'est cool, vous avez vraiment compris mon problème.
Parmi vos solutions c'est laquelle la mieux?
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
41
Salut,


sur ce principe la :



<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Kate, the KDE Advanced Text Editor">

$nom='maxime';
$variable='nom';
echo $$variable;

j'ai pondu un code qui ne marchait pas...






<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Kate, the KDE Advanced Text Editor">

$liste=array(
array(132,1),
array(516,1),
array(891,1));
$indice='[0][0]';
eval('echo $liste'.$indice.';');

mais ça ça marche... et c'est quand même beaucoups plus propre qu la réponse que t'as accèpté...



mais avec un peu de parsing, tu pourrais exploiter tes indices comme des int...



list($indice1, $indice2)=explode($indice);

$indice1=intval(substr($indice1,1));

$indice2=intval($indice2);


In a dream, I saw me, drop dead... U was there, U cried... It was just a dream, if I die, U won't cry, maybe, U'll be happy

Mon site (articles sur la programmation et programmes)
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
8
Oulala... question difficile et dangeureuse;)



Pour moi, la solution malalam est la plus jolie car :

* correspond à une logique de Programmation

* respecte le types des données (tableau, indices, ...)

* évite les merdouilles à base de var-var et eval



Par contre, si je comprend ton problème... la dimension de tes tableau est variable...

et là, j'ai comme l'impression que tu y es jusqu'au cou !





<?php

function RechercheValeurTabeau($tab, $val, $indice=array()) {

if(!is_array($tab)) return false;

foreach($tab as $k=>$v) {

if( is_array($v) ) {

$indice[] = $k;

$res = RechercheValeurTableau($v, $val, $indice);

if( $res ) return $res;

}

else if($v = $val) return $out."[$k]";

}

return false;

}



function TrouveMoiUnNom($tab, $indice) {

if( !is_array($tab) ) return $tab;

if( !is_array($indice) or empty($indice) ) return false;

$k = array_shift($indice);

if(isset($tab[$k])) return TrouveMoiUnNom($tab[$k],$indice);

else return false;

}



$Indice=RechercheValeurTableau($Liste1,516)

echo TrouveMoiUnNom($Liste1, $Indice);

?>





Mise à part quelques erreurs de syntaxe (ou même de conception)... C'est noël ;)





A+
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
8
Pardon...





<?php

function RechercheValeurTabeau($tab, $val, $indice= array()) {

if(!is_array($tab)) return false;

foreach($tab as $k=>$v) {

if($v = $val) {

$indice[] = $k;

return $indice;

}

if( is_array($v) ) {

$indice[] = $k;

if( $res = RechercheValeurTableau($v, $val, $indice) ) return $res;

}

}

return false;

}



function TrouveMoiUnNom($tab, $indice) {

if( !is_array($tab) ) return $tab;

if( !is_array($indice) or empty($indice) ) return false;

$k = array_shift($indice);

if(isset($tab[$k])) return TrouveMoiUnNom($tab[$k],$indice);

else return false;

}



$Indice=RechercheValeurTableau($Liste1, 516 )

echo TrouveMoiUnNom($Liste1, $Indice);

?>





Bon, c'est pas très beau... je sais ! Mais le but est de faire efficace et conci.





coucou =>

La différence entre

$liste=array(
array(132,1),
array(516,1),
array(891,1));
$indice='[0][0]';
eval('echo $liste'.$indice.';');

et

$Liste1[0]= Array(132,1);
$Liste1[1]= Array(516,1);
$Liste1[2]= Array(891,1);
$indice = "[0][0]";
eval("echo \$Liste1$indice;");

?


Les guillemets, c'est ça !

Donc un détail.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
if($v = $val)
=>
if($v === $val)
ou ==; ça dépend comment on veut gérer ça : typage ou po.
;-)

Quant à la fonction, bah, y a plus moche, et ça marche (à priori hein, j'ai pas testé, mais le principe est celui auquel je pensais, plus ou moins).