Gestion d'indices de tableaux

Résolu
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010 - 28 déc. 2005 à 12:37
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010 - 29 déc. 2005 à 11:38
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

J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
28 déc. 2005 à 12:56
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
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 déc. 2005 à 12:57
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
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 déc. 2005 à 12:57
J'avais pas pensé au eval () tien :-)
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
28 déc. 2005 à 13:03
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]];
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 déc. 2005 à 13:11
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)
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
28 déc. 2005 à 13:18
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>
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 déc. 2005 à 13:26
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)
0
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010
28 déc. 2005 à 14:00
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
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 déc. 2005 à 14:09
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.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 déc. 2005 à 14:13
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)
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
28 déc. 2005 à 14:25
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.
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
28 déc. 2005 à 14:29
t'as essayé avant ?



<?php

$liste = "Liste1";

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



echo ${$liste.$indice};

?>



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







Si vous n'aimez pas cette façon d'ecrire.... criez fort ;)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 déc. 2005 à 14:34
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.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 déc. 2005 à 14:34
echo $"$liste$indice";

Ca marche, CA ? lol...burk...
0
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010
28 déc. 2005 à 14:40
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?
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
28 déc. 2005 à 14:49
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)
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
28 déc. 2005 à 15:13
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+
0
J_G Messages postés 1406 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 28 août 2007 10
28 déc. 2005 à 15:21
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.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 déc. 2005 à 15:55
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).
0
Rejoignez-nous