Discussion:
Recibir un array en $_POST desde FORM...
(demasiado antiguo para responder)
Walter
2006-04-06 17:04:50 UTC
Permalink
Hola gente, tengo el siguiente problema, supongo que es una pavada pero
no doy pie con bola...

Tengo un formulario HTML donde hay un select multiple...
(esto es a manera de ejemplo)

<FORM METHOD="post" ACTION="recibeColores.php">
<SELECT NAME="nColores[]" MULTIPLE="yes">
<OPTION VALUE="1">AZUL
<OPTION VALUE="2">ROJO
<OPTION VALUE="3">AMARILLO
<OPTION VALUE="4">VERDE
<OPTION VALUE="5">NARANJA
<OPTION VALUE="6">VIOLETA
</SELECT>
<INPUT TYPE="submit" VALUE="Aceptar" NAME="enviarColores">
<INPUT TYPE="reset" VALUE="Cancelar">
</FORM>

Supuestamente el usuario seleccionó más de un color.
Bien, ahora los quiero leer en 'recibeColores.php' que sería más o
menos
así... (y acá se me quemaron los papeles)

<?php

if ($_POST["enviarColores"]) {

// esto no me funcionó...
$aColores = $_POST["nColores[]"];

// aunque la siguiente línea me muestra la cantidad
// de elementos seleccionados...
echo "<br>count del post: ".count($_POST["nColores"])."<br><br>";

// y la siguiente me muestra el contenido...
print_r($_POST["nColores"]);

} // endif

?>

Lo que no me doy idea como asignarle a otro array el contenido del que
viene del formulario.

Yo quería hacer algo del tipo...

for ($i = 1; $i <= count($_POST["nColores"]); $i++) {
$aColores[$i] = $_POST["nColores[$i-1];
}

de manera que me queden los elementos que recibo en $aColores, pero
realmente no se me ocurre como. Obviamente el código anterior no
funciona.

Les agradecería me den una mano con esto.
Saludos,
Walter
.-----.
/ \ _ / \ __
(\/ / \ |_/oo)
\--------------~
// || || \\
http://www.swcomputacion.com/
Iván Sánchez Ortega
2006-04-06 17:25:02 UTC
Permalink
Post by Walter
<FORM METHOD="post" ACTION="recibeColores.php">
<SELECT NAME="nColores[]" MULTIPLE="yes">
[...]
Post by Walter
print_r($_POST["nColores"]);
¿Podrías postear lo que te sale al ejecutar ese print_r() ?
Post by Walter
for ($i = 1; $i <= count($_POST["nColores"]); $i++) {
$aColores[$i] = $_POST["nColores[$i-1];
}
Nunca, nunca, NUNCA uses un bucle for(;;) para iterar sobre un array en PHP.
Usa foreach(). Échale un vistazo al manual (http://php.net/foreach)

Lo típico sería algo así como:
<?php
foreach($_POST['nColores'] as $numero_color)
{
echo "Se ha elegido el color $numero_color <br/>\n";
}
?>

- --
- ----------------------------------
Iván Sánchez Ortega -i-punto-sanchez--arroba-mirame-punto-net

http://acm.asoc.fi.upm.es/~mr/
Proudly running Debian Linux with 2.6.15-1-686 kernel, KDE3.5.0, and PHP
5.1.2-1+b1 generating this signature.
Uptime: 19:21:06 up 1 day, 6:01, 2 users, load average: 0.89, 1.36, 1.23
countach
2006-04-07 07:29:00 UTC
Permalink
Post by Iván Sánchez Ortega
Nunca, nunca, NUNCA uses un bucle for(;;) para iterar sobre un array
en PHP. Usa foreach(). Échale un vistazo al manual
(http://php.net/foreach)
Bueno, bueno, tampoco NUNCA, porque en arrays donde sabes que tienen un
indice numérico es casi mejor.

Por ejemplo, una consulta a la base de datos se recorre más elegantemente
para leer y escribir en su contenido con un

$t=count($resultado_consulta);
for ($n=0; $n < $t; $n++) {
echo $resultado_consulta[$n]['campo'];
$resultado_consulta[$n]['nuevo_campo']=true;
}



Que con un:

foreach ($resultado_consulta as $n=> $fila)
if (!empty($fila)) {
echo $fila['campo]';
$resultado_consulta[$n]['nuevo_campo'] = true;
}

Porque en las consultas a BD, siempre se devuelve una ultima fila vacía en
el array, luego el foreach dará una de más que luego hay que vigilarla, en
este caso con !empty()
Iván Sánchez Ortega
2006-04-07 08:21:16 UTC
Permalink
Post by countach
Bueno, bueno, tampoco NUNCA, porque en arrays donde sabes que tienen un
indice numérico es casi mejor.
Vale, de acuerdo. Una de cada cien arrays con las que trabajes estará
construída desde tu código, y tendrás una total certeza de que es con
claves numéricas, y compacta (sin huecos entre las claves), y hacer un
bucle llevará una ventaja por algún lado.

Pero en la grandísima mayoría de los casos, o no me importa la clave (sólo
los valores), o no me puedo asegurar de que el array es compacto y bien
formado (valores introducidos por el usuario), o el array tiene claves
alfanuméricas.

Vamos, que lo bueno es acostumbrarse a usar foreach(), que te va a soltar
muchos menos errores y problemas que un for(;;). Si luego se tiene que usar
un for(;;) en alguna ocasión, se usa.
Post by countach
Porque en las consultas a BD, siempre se devuelve una ultima fila vacía en
el array, luego el foreach dará una de más que luego hay que vigilarla, en
este caso con !empty()
Pues no, porque las consultas a BBDD las hago siempre con un while($fila =
mysql_fetch_row()) ;-)

- --
- ----------------------------------
Iván Sánchez Ortega -i-punto-sanchez--arroba-mirame-punto-net

http://acm.asoc.fi.upm.es/~mr/ ; http://acm.asoc.fi.upm.es/~ivan/
MSN:***@hotmail.com
Jabber:***@jabber.org ; ***@kdetalk.net
countach
2006-04-07 09:14:54 UTC
Permalink
Post by Iván Sánchez Ortega
Post by countach
Porque en las consultas a BD, siempre se devuelve una ultima fila
vacía en el array, luego el foreach dará una de más que luego hay
que vigilarla, en este caso con !empty()
Pues no, porque las consultas a BBDD las hago siempre con un
while($fila = mysql_fetch_row()) ;-)
Oño, a ver cómo lo hago yo... (es una de esas funciones de librería que
construyes al principio y luego ya te olvidas)


// Esta función retorna un array con todo ya relleno
function GetSelectListData($as_select, &$ll_rows, $ai_modo=MYSQL_ASSOC)
{
$ll_rows=0;

$dbq = do_mysql_query($as_select);

if (mysql_num_rows($dbq))
while ($datawindow[$ll_rows] = mysql_fetch_array($dbq, $ai_modo))
$ll_rows++;

mysql_free_result($dbq);

return $datawindow;
}


Pues no veo la diferencia !! (De todas formas se me ocurre refinar el
algoritmo para evitar esa ultima linea vacía).
Iván Sánchez Ortega
2006-04-07 21:31:05 UTC
Permalink
countach wrote:

[...]
Post by countach
while ($datawindow[$ll_rows] = mysql_fetch_array($dbq, $ai_modo))
[...]
Post by countach
Pues no veo la diferencia !! (De todas formas se me ocurre refinar el
algoritmo para evitar esa ultima linea vacía).
Ahá! La última vez que estás haciendo ese bucle, se asigna un "false" a
$datawindow[$ll_rows]. Variables temporales al rescate ;-)

- --
- ----------------------------------
Iván Sánchez Ortega -i-punto-sanchez--arroba-mirame-punto-net

Now listening to: Sunflower - La Música de los Dioses - CD 20 - [15] Keep on
(4:21) (94%)
countach
2006-04-10 07:52:30 UTC
Permalink
Post by Iván Sánchez Ortega
[...]
Post by countach
while ($datawindow[$ll_rows] = mysql_fetch_array($dbq, $ai_modo))
[...]
Post by countach
Pues no veo la diferencia !! (De todas formas se me ocurre refinar el
algoritmo para evitar esa ultima linea vacía).
Ahá! La última vez que estás haciendo ese bucle, se asigna un "false"
a $datawindow[$ll_rows]. Variables temporales al rescate ;-)
Exacto, ya lo modifiqué usando un $temp!

Pues no llevo años tirando con esa incorrección, pero claro, como un usaba
for en lugar de foreach, me daba igual....

wlinux@gmail.com
2006-04-07 07:48:24 UTC
Permalink
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Post by Walter
<FORM METHOD="post" ACTION="recibeColores.php">
<SELECT NAME="nColores[]" MULTIPLE="yes">
[...]
Post by Walter
print_r($_POST["nColores"]);
¿Podrías postear lo que te sale al ejecutar ese print_r() ?
Algo así como...
Array ( [0] => 2 [1] => 3 )
Post by Walter
for ($i = 1; $i <= count($_POST["nColores"]); $i++) {
$aColores[$i] = $_POST["nColores[$i-1];
}
Nunca, nunca, NUNCA uses un bucle for(;;) para iterar sobre un array en PHP.
Usa foreach(). Échale un vistazo al manual (http://php.net/foreach)
<?php
foreach($_POST['nColores'] as $numero_color)
{
echo "Se ha elegido el color $numero_color <br/>\n";
}
?>
Ok, probé con foreach y funcionó, por suerte ya le había encontrado
la vuelta con el for, pero viendo tu recomendación tal vez lo
reemplace por el foreach.
Ahora si tenes tiempo y ganas... ¿por qué pones tanto énfasis en no
utilizar el for sobre un array?
Te agradezco la respuesta y te mando un saludo,
Walter
.-----.
/ \ _ / \ __
(\/ / \ |_/oo)
\--------------~
// || || \\
http://www.swcomputacion.com/
- --
- ----------------------------------
Iván Sánchez Ortega -i-punto-sanchez--arroba-mirame-punto-net
http://acm.asoc.fi.upm.es/~mr/
Proudly running Debian Linux with 2.6.15-1-686 kernel, KDE3.5.0, and PHP
5.1.2-1+b1 generating this signature.
Uptime: 19:21:06 up 1 day, 6:01, 2 users, load average: 0.89, 1.36, 1.23
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.2 (GNU/Linux)
iD8DBQFENU7v3jcQ2mg3Pc8RAq3yAJ9AckpUgxhLsufOFK6pmRb/LbsryACcDAiv
Bbmy4ZEkI8zynnnD/HKb+V8=
=PovM
-----END PGP SIGNATURE-----
Iván Sánchez Ortega
2006-04-07 08:17:39 UTC
Permalink
Post by ***@gmail.com
Ahora si tenes tiempo y ganas... ¿por qué pones tanto énfasis en no
utilizar el for sobre un array?
Intenta sacar los valores de estos arrays con for y con foreach y
compruébalo tú mismo:

$a1 = array('rojo'=>'#FF0000' , 'azul'=>'#00FF00' , 'verde'=>'#0000FF' );

$a2[3] = 33;
$a2[5] = 55;
$a2[8] = 88;

- --
- ----------------------------------
Iván Sánchez Ortega -i-punto-sanchez--arroba-mirame-punto-net

Un ordenador no es un televisor ni un microondas, es una herramienta
compleja.
Continúe leyendo en narkive:
Loading...