Foros del Web » Programando para Internet » PHP »

Ayuda para evaluar un array desde una cadena

Estas en el tema de Ayuda para evaluar un array desde una cadena en el foro de PHP en Foros del Web. Bueno, estoy desarrollando una aplicacion y la funcion eval no me evalua el código que le pido. Extraje y resumí el sector del código con ...
  #1 (permalink)  
Antiguo 02/12/2003, 13:15
Avatar de nublar
(Desactivado)
 
Fecha de Ingreso: octubre-2003
Ubicación: Argentina - BsAs
Mensajes: 321
Antigüedad: 20 años, 6 meses
Puntos: 0
Exclamación Ayuda para evaluar un array desde una cadena

Bueno, estoy desarrollando una aplicacion y la funcion eval no me evalua el código que le pido.
Extraje y resumí el sector del código con problemas para que me puedan ayudar

Código PHP:
//tengo tres cadenas de caracteres
$linea1="titulo1=>'automotores',subtitulo1=>'ford'";
$linea2="titulo2=>'automotores',subtitulo1=>'chevrolet'";
$linea3="titulo3=>'automotores',subtitulo3=>'fiat'";


//deacuerdo al valor que tenga $i en el tiempo cargo el array
$i=1;

//Pero la siguiente linea no me funciona por que la variables $oferta1no se carga
//Ayudenme a que esta linea funcione ....
eval("\$oferta1=array($linea$i);");

//Y por ende no ne muestra nada la siguiente:
echo $oferta1['subtitulo1']; 
  #2 (permalink)  
Antiguo 02/12/2003, 13:27
 
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona - España
Mensajes: 270
Antigüedad: 21 años, 5 meses
Puntos: 0
te faltan [ ] en $i
  #3 (permalink)  
Antiguo 02/12/2003, 15:30
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Seria mas facil si haces como recomienda Cocker, poner las lineas en un array:
Código PHP:
//tengo tres cadenas de caracteres

$linea[1]="titulo1=>'automotores',subtitulo1=>'ford'";

$linea[2]="titulo2=>'automotores',subtitulo1=>'chevrolet'";

$linea[3]="titulo3=>'automotores',subtitulo3=>'fiat'";





//deacuerdo al valor que tenga $i en el tiempo cargo el array

$i=1;



//Pero la siguiente linea no me funciona por que la variables $oferta1no se carga

//Ayudenme a que esta linea funcione ....

eval("\$oferta1=array($linea[$i]);");



//Y por ende no ne muestra nada la siguiente:

echo $oferta1['subtitulo1']; 
Si de todas formas quieres hacerlo como lo tienes, debes mirar como funcionan las "variables variables" (http://www.php.net/manual/en/languag...s.variable.php)
Código PHP:
//tengo tres cadenas de caracteres

$linea1="titulo1=>'automotores',subtitulo1=>'ford'";

$linea2="titulo2=>'automotores',subtitulo1=>'chevrolet'";

$linea3="titulo3=>'automotores',subtitulo3=>'fiat'";





//deacuerdo al valor que tenga $i en el tiempo cargo el array

$i=1;



//Pero la siguiente linea no me funciona por que la variables $oferta1no se carga

//Ayudenme a que esta linea funcione ....

eval("\$oferta1=array(${'linea'.$i});");



//Y por ende no ne muestra nada la siguiente:

echo $oferta1['subtitulo1']; 
El problema que tenias originalmente es que no estabas generando bien el nombre de la variable linea. Con el codigo que tenias estabas concatenando el valor de la variable $linea (que no existia) con el valor de la variable $i, no cogiendo el valor de la variable cuyo nombre era el resultado de concatenar 'linea' con el valor de $i (que es lo que hace el ultimo ejemplo que te he puesto con las variables variables).

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #4 (permalink)  
Antiguo 02/12/2003, 19:26
Avatar de nublar
(Desactivado)
 
Fecha de Ingreso: octubre-2003
Ubicación: Argentina - BsAs
Mensajes: 321
Antigüedad: 20 años, 6 meses
Puntos: 0
$Gracias = "Josemi";
- Sos lo más grande do mundo, pasame una foto tuya que la amplio y la pongo como "POSTER" en mi piesa, alado a la de Boca Jrs.
- A medida que aprendo me surgen nuevas dudas.
Gracias por la paciencia y dedicacion.
  #5 (permalink)  
Antiguo 02/12/2003, 20:50
Avatar de nublar
(Desactivado)
 
Fecha de Ingreso: octubre-2003
Ubicación: Argentina - BsAs
Mensajes: 321
Antigüedad: 20 años, 6 meses
Puntos: 0
Bueno probé con los corchetes y funciono. [i].




Código PHP:
$linea[1]="titulo1=>'automotores',subtitulo1=>'ford'";

$linea[2]="titulo2=>'automotores',subtitulo1=>'chevrolet'";

$linea[3]="titulo3=>'automotores',subtitulo3=>'fiat'";


$i=1;


eval(
"\$oferta1=array($linea[$i]);");

echo 
$oferta1['subtitulo1']; 



Ahora lo bueno sería aprender por que funcionó, y mi pregunta es:

La variable $oferta1 Cuantos índices tiene?
>Un indice lo toma de $i
>El otro índice lo toma textual de la cadena linea[$i]

Por lo que veo tiene dos índices, pero se comporta ante la funcion "echo" como un array normal... ¿es $oferta un array multidimensional?

Lo de las variables variables lo estuve viendo, está bueno, pero el primer método es mas práctico aunque no lo entienda mucho..

Gracias Cocker por tu respuesta tambien tenías razon aunque al ser tan consiza y como soy newby no la entendía.
  #6 (permalink)  
Antiguo 02/12/2003, 23:45
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Al utilizar la función eval con la cadena, en tu caso, ocurre esto:
Código PHP:
//Esta es la línea original:
eval("\$oferta1=array($linea[$i]);");

//Se reemplazan las variables en la cadena por sus respectivos valores.
//O sea que antes de ejecutarse el eval la cadena se reemplaza así:

//Primero se reemplaza $i:
eval("\$oferta1=array($linea[1]);");

//Luego se reemplaza $linea[1]:
eval("\$oferta1=array(titulo1=>'automotores',subtitulo1=>'ford');");

//$oferta1 no se reemplaza porque tiene la contrabarra (no se trata como variable).

//O sea que al poner:
eval("\$oferta1=array($linea[$i]);");

//Pasa exactamente lo mismo que si pusieras simplemente:
$oferta1=array(titulo1=>'automotores',subtitulo1=>'ford');

//O sea, creas el array llamado "$oferta1" que tiene 2 índices: (titulo1 y subtitulo1) 
Espero que se haya entendido.
Saludos
  #7 (permalink)  
Antiguo 04/12/2003, 07:53
Avatar de nublar
(Desactivado)
 
Fecha de Ingreso: octubre-2003
Ubicación: Argentina - BsAs
Mensajes: 321
Antigüedad: 20 años, 6 meses
Puntos: 0
uff... es mucho mas complejo de lo que parecía...

Bueno antes que nada gracias por la ayuda...verdaderamente ya me dá un poco de verguenza seguir preguntándoles sobre lo mismo...
pero realmente hice un gran esfuerzo y mo quisiera que muera acá, el tema ahora el el siguiente:

<?
//tengo tres cadenas de caracteres
$linea[1]="titulo1=>'automotores',subtitulo1=>'ford'";
$linea[2]="titulo2=>'automotores',subtitulo1=>'chevrolet '";
$linea[3]="titulo3=>'automotores',subtitulo3=>'fiat'";

Código PHP:
for ($i=1;$i<=3;$i++)
//hasta acá funciona, creo 3 arrays $oferta1,$oferta2 y $oferta3
{
eval(
"\$oferta$i=array($linea[$i]);");//hasta acá todo Ok!
}
$i=1;
//esto funciona..
eval("echo \$oferta1['titulo$i'];");
//pero si quiero interactuar dinámicamente con la variable $oferta.. falla¿?
eval("echo '\$oferta$i'['titulo$i'];"); //->no funciona
eval("echo \${'oferta'.$i}['titulo$i'];");//->el consejo de josemi tampoco aca no me funciona
//Sinceramente no sé como hacer .....
?> 
  #8 (permalink)  
Antiguo 04/12/2003, 08:48
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Para esos echo no necesitas el eval. Simplemente podrias hacer:
Código PHP:
echo ${'oferta'.$i}['titulo'.$i]; 
Aunque si quieres ver como seria con el eval:
Código PHP:
eval("echo \$oferta$i['titulo$i'];"); 
que tal como explico jpinedo, se transforma en:
Código PHP:
echo $oferta1['titulo1']; 
si $i es 1.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.

Última edición por josemi; 04/12/2003 a las 08:50
  #9 (permalink)  
Antiguo 04/12/2003, 20:33
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Creo que como tema didáctico, es válida tu curiosidad por conocer el funcionamiento del eval(). Pero tal como te dijo josemi, Lo más simple es, en tu ejemplo, no utilizarlo.

La función eval() recibe una cadena de texto como parámetro. Tu problema está en algunas comillas simple que estás poniendo de más, lo cual genera una cadena no válida.

Como ejercicio para que se ta aclare más el tema te planteo lo siguiente:
Código PHP:
//Tú escribiste esto:
eval("echo '\$oferta$i'['titulo$i'];"); //->no funciona

O sea tú pretendes que se ejecute así:
echo 
$oferta1['titulo1'];//esta línea debería generarse con tu código. Pero no lo hace. 
Lo mejor es guardar las cadenas en una variable aparte y luego pasar la variable por eval(). O sea en tu ejemplo sería así:
Código PHP:
$cadena="echo '\$oferta$i'['titulo$i'];";
eval(
$cadena); 
Lo anterior hace exactamente lo que tú pusiste... o sea que tampoco va a funcionar. La diferencia es que ahora puedes saber qué es lo que escribiste mal... o sea que en lugar de pasarla por eval() para que se ejecute, puedes mandar a que se escriba la cadena en pantalla para que veas qué está pretendiendo ejecutar.
Código PHP:
echo $cadena
Verás que la cadena que está tratando de pasar está equivocada. Creo que debes eliminar las dos primeras comillas simples.

Ésta práctica es muy saludable pues te permite encontrar errores con mayor facilidad. Por ejemplo hay quienes por ahorrar líneas ponen:
Código PHP:
$row=mysql_fetch_array(mysql_query("SELECT $campo FROM $tabla2 WHERE id=$_POST[id]"), $link); 
El problema es que si le sale un error en esa línea (y lo hay)... será muy difícil identificarlo. Lo mejor sería así:
Código PHP:
$sql="SELECT $campo FROM $tabla2 WHERE id=$_POST[id]";
$result=mysql_query($sql$link);
$row=mysql_fetch_array($result); 
Acá podrás hacer un echo $sql; para saber si la cadena que pasas es válida.

Creo que me salí un poco del tema, pero también creo que es importante... Por eso cuando tengas errores en alguna función a la que le estés pasando una cadena como parámetro, mejor guarda la cadena en una variable y pasa como parámetro la variable... así, cualquier cosa haces un echo $variable; y puedes encontrar errores más fácilmente.

Saludos

PD: Mucha más información sobre el tema en la página de josemi.

Última edición por jpinedo; 04/12/2003 a las 21:40
  #10 (permalink)  
Antiguo 06/12/2003, 05:13
Avatar de nublar
(Desactivado)
 
Fecha de Ingreso: octubre-2003
Ubicación: Argentina - BsAs
Mensajes: 321
Antigüedad: 20 años, 6 meses
Puntos: 0
Pinedo Y Josemi.
GRACIASSSSSSSS!!
Ya tengo que poner dos posters. =)
Lo pruebo y les aviso.
Un abrazo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 17:58.