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 à 16:14
bien vu pour le '='...
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 à 17:12
J_G j'ai fait une fonction récursive telle que tu le fais.
Si j'ai bien compris, tu as une première fonction qui récupére le tableau où il y a la valeur qui nous intéresse en ensuite une deuxième qui cherche la valeur dans ce tableau.
C'est ça???
Voilà ma solution en une fonction :
function RechercheValeurTableau($Tableau,$Valeur,$IndexARechercher)
{
$Trouve=0;
$i=0;
while($Trouve==0 && $i<count($Tableau))
{
if(is_array($Tableau[$i]))
{
$Indice=RechercheValeurTableau($Tableau[$i],$Valeur,$IndexARechercher);
if($Indice!=-1)
{
$Trouve=1;
$i="[".$i."]".$Indice;
}
else
{
$i++;
}
}
else
{
if($IndexARechercher!="")
{
if(isset($Tableau[$IndexARechercher]))
{
if($Tableau[$IndexARechercher]=$Valeur)
{
$Trouve=1;
$i="[".$IndexARechercher."]";
}
else
{
$i++;
}
}
else
{
$i++;
}
}
else
{
if($Tableau[$i]==$Valeur)
{
$Trouve=1;
$i="[".$i."]";
}
else
{
$i++;
}
}
}
}
if($i==count($Tableau))
{
$i=-1;
}
return $i;
}

Je crains les critiques :( mais vous êtes là pour me corriger ;)
En tout cas ça fait exactement ce que je veux NAHHH!!! :)
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 à 17:14
A bah mince alors, mes indentations n'y sont pas :'(
Faites un copier/coller et indentez le parce que là sinon ça va être dur à comprendre.
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 à 18:26
Ben si ça marche... j'ai aucune critique à faire !



Je dirais même Bravo !!!



A+
0

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

Posez votre question
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010
28 déc. 2005 à 18:47
T'as essayé pour voir le principe???
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 à 22:34
Petit problème J_G, je tape :
$Liste1=Array(Array(0,2));
$liste = "Liste1";
$indice = "[0][0]";
echo $"\$liste\$indice";
Et alors là j'ai un petit message d'erreur qui me dit :
Parse error: parse error, expecting `T_VARIABLE' or `'$'' in c:\program files\easyphp1-8\www\... on line 56
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 à 22:52
Non, j'ai pas testé ta fonction... puisque tu dis qu'elle marche et fait ce que tu veux.



Mais bon, aller ! Je la copie/colle/indente/regarde et te dis ce que j'en pense...



A+





PS :



J'ai écrit

echo $"\$liste$indice";



pas

echo $"\$liste\$indice";
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 à 23:11
Me re-voilàaaa !





Bon, je savais qu'il ne fallait pas regarder cette fonction...

Tu te mets au devant de nombreuse remarques !!! Je ne les ferais pas toutes, mais certaines qui me semble essentielles :







function RechercheValeurTableau($Tableau,$Valeur,$IndexARechercher) {

$Trouve= 0; /*1*/

$i =0; /*2*/

while($Trouve= =0 /*1*/ && $i<count($Tableau)) {

if(is_array($Tableau[$i])) { /*2*/

$Indice =RechercheValeurTableau($Tableau[$i],$Valeur,$IndexARechercher);

if($Indice!= -1) { /*3*/

$Trouve =1; /*1*/

$i= "[".$i."]".$Indice;

}

else {

$i++;

}

}

else {

if($IndexARechercher!="") {

if(isset($Tableau[$IndexARechercher])) {



if($Tableau[$IndexARechercher]=$Valeur) {

$Trouve=1; /*1*/



$i ="[".$IndexARechercher."]"; /*4*/

}

else {

$i++;

}

}

else {

$i++;

}

}

else {

if($Tableau[$i]= =$Valeur) {

$Trouve=1; /*1*/

$i ="[".$i."]";

}

else {

$i++;

}

}

}

}

if($i= =count($Tableau)) {

$i=-1;

}

return $i;

}



/*1*/ => Plusieur pb de conception :

1. utilise un booléen !

2. au lieu de mettre Trouve à 1 pour sortir de la boucle, SORT de la
boucle en utilisant la commande "break;" ("continue;" retourne au début
de la boucle)





/*2*/ = > donc on est d'accord... tu n'utilises que des
tableau indexés (que des clefs entières avec les chiffres qui se
suivent bien gentillement...)

De plus ! aucun test pour savoir si la clef existe :(genre isset ou array_key_exists ):



/*3*/ => utilise des bool



/*4*/ => le plus grave !!!

Mélange des types (comme disait mon prof de maths : "tu mélanges les carottes et les bettrave")

Après cette opération, $i est un string... Or tu l'utilises encore dans
la condition du while en le comparrant à un entier => aucune
garantie de résultat !



Si tu veux continuer à faire une soupe avec plein de légumes, utilise
bien le comparateur d'identicité (===) et non d'égalité (==)...





Voilà pour un petit commentaire, vite-fait-mal-fait !



A+
0
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010
29 déc. 2005 à 01:05
Oula oui t'as tout à fait raison.
Je crois que je vais reprendre gentillement les deux fonctions que tu m'as proposé ;)
Sinon, j'ai remplacé echo $"\$liste\$indice"; par echo $"\$liste$indice"; et rien à faire c'est pareil. Au fait le \ en trop c'est j'ai fait des essais sans succès ...
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
29 déc. 2005 à 01:24
Sinon, j'ai remplacé echo $"\$liste\$indice"; par echo $"\$liste$indice"; et rien à faire c'est pareil.



Cette syntaxe était une (mauvaise) blague... "undefine variable Liste1[0][0]"

Utilise plutot eval("return \$liste$indice;");





Pour mes deux fonctions, je ne garantie pas le bon fonctionnement... Je serais encore à l'écoute pour les corriger au besoin.



A+
0
pcmanprogrammeur Messages postés 126 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 16 octobre 2010
29 déc. 2005 à 10:25
Après réflexion (si si ça l'arrive), je me suis dit que tes fonctions permettaient de récupérer les valeurs des tableaux dans des tableaux dans des tableaux
dans des tableaux
... et non pas de pouvoir modifier le tableau d'origine. C'est pourquoi j'ai créé ma fonction qui permet d'indiquer le chemin. Comme ça je peux aller modifier à ma guise le contenu.
Ducoup, je vais reprendre tes remarques sur ma fonction.
Au fait, petite remarque de ma part : les 1 et 0 que j'utilise pour des booléens sont dûs à la déformation du C. Vu qu'en C le booléen n'existe pas, on utilise les entiers comme valeurs booléens.
0
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
Voilà, j'ai remodifié tout ça. J'espère que ça te plaira
function RechercheValeurTableau($Tableau,$Valeur,$IndexARechercher)
{
$Trouve=false;
$i=0;
$Chemin="";
while(!$Trouve && $i<count($Tableau))
{
if(is_array($Tableau[$i]))
{
$Indice=RechercheValeurTableau($Tableau[$i],$Valeur,$IndexARechercher);
if($Indice[0])
{
$Trouve=true;
$Chemin="[".(string)$i."]".(string)$Indice[1];
}
else
{
$i++;
}
}
else
{
if($IndexARechercher!="")
{
if(isset($Tableau[$IndexARechercher]))
{
if($Tableau[$IndexARechercher]==$Valeur)
{
$Trouve=true;
$Chemin="[".(string)$IndexARechercher."]";
}
else
{
$i++;
}
}
else
{
$i++;
}
}
else
{
if($Tableau[$i]==$Valeur)
{
$Trouve=true;
$Chemin="[".(string)$i."]";
}
else
{
$i++;
}
}
}
}
return Array($Trouve,$Chemin);
}

Pour le test :
$Liste1=Array(
Array(
Array(132,1),
Array(2,3),
23),
Array(
Array(516,1),
Array(8),
64),
Array(
Array(891,1),
Array(6),
56),
Array(
Array(564,1),
Array(7),
12),
Array(
Array(489,1),
Array(1),
32),
Array(
Array(135,489),
Array(3),
48),
Array(
Array(489,1354),
Array(2),
489),
Array(
Array(158,1),
Array(4),
31)
);
$Indice=RechercheValeurTableau($Liste1,489,1);
if($Indice[0])
{
eval ("echo \$Liste1$Indice[1];");
}

Comme y'a tout pour que tu puisses tester sans problèmes
J'attend plus que tes remarques ... (positives comme négatives bien sûr)
0
Rejoignez-nous