Cómo obtener una matriz de entrada de formulario en una matriz PHP

92

Tengo un formulario como el que se muestra a continuación, que está publicado en contact.php, y el usuario puede agregar más dinámicamente con jquery.

<input type="text" name="name[]" />
<input type="text" name="email[]" />

<input type="text" name="name[]" />
<input type="text" name="email[]" />

<input type="text" name="name[]" />
<input type="text" name="email[]" />

Si los hago eco en php con el siguiente código

$name = $_POST['name'];
$email = $_POST['account'];

foreach( $name as $v ) {
print $v;
}

foreach( $email as $v ) {
print $v;
}

Obtendré algo como esto:

nombre1nombre2nombre3email1email2email3

¿Cómo puedo obtener esas matrices en algo como el código siguiente?

function show_Names($n, $m)
{
return("The name is $n and email is $m, thank you");
}

$a = array("name1", "name2", "name3");
$b = array("email1", "email2", "email3");

$c = array_map("show_Names", $a, $b);
print_r($c);

entonces mi salida es así:

El nombre es name1 y el correo electrónico es email1 , gracias
El nombre es name2 y el correo electrónico es email2 , gracias
El nombre es name3 y el correo electrónico es email3 , gracias

gracias por cualquier ayuda o consejo

thom
fuente

Respuestas:

146

Ya están en matrices: $namees una matriz, como está$email

Entonces, todo lo que necesita hacer es agregar un poco de procesamiento para atacar ambas matrices:

$name = $_POST['name'];
$email = $_POST['account'];

foreach( $name as $key => $n ) {
  print "The name is ".$n." and email is ".$email[$key].", thank you\n";
}

Para manejar más entradas, simplemente extienda el patrón:

$name = $_POST['name'];
$email = $_POST['account'];
$location = $_POST['location'];

foreach( $name as $key => $n ) {
  print "The name is ".$n.", email is ".$email[$key].
        ", and location is ".$location[$key].". Thank you\n";
}
Jeffrey Blake
fuente
gracias, ¿qué pasa si agrego otra entrada como ubicación [], cómo podría agregar eso también?
thom
1
Básicamente, solo extiendes el patrón. Vea mi edición anterior ... cualquier entrada adicional también será matrices cuando las asigne desde $ _POST (asumiendo que hay múltiples entradas con ese nombre en el html, como lo hizo con estos campos).
Jeffrey Blake
1
Jeffrey, me pregunto si puedo confiar en el orden de las matrices. Es decir, ¿estamos seguros de que $emails[1]corresponde al usuario nombrado $name[1]? Creo que tuve problemas con esto en el pasado, pero podría estar equivocado. Gracias
idrarig
1
@bruciasse: la forma en que el servidor maneja las matrices de entrada como esta variará de un servidor web a otro (diferentes sistemas operativos implementan cosas de manera diferente cuando se trata de detalles finos como este), sin embargo, todas las plataformas en las que he empleado estas técnicas son consistentes dentro sí mismo (es decir, el orden es el mismo cada vez). Es posible que un navegador pueda mezclar el orden de las variables de solicitud antes de pasar la solicitud al servidor, pero esperaría que esto sea bastante inusual. El problema final que podría enfrentar es que el html se mezcle en un orden extraño y el CSS se ajuste
Jeffrey Blake
... el posicionamiento. Si su página fuera así, seguramente vería algunos problemas extraños con el orden de las matrices.
Jeffrey Blake
52

Por ejemplo, nombrando los campos como

<input type="text" name="item[0][name]" />
<input type="text" name="item[0][email]" />

<input type="text" name="item[1][name]" />
<input type="text" name="item[1][email]" />

<input type="text" name="item[2][name]" />
<input type="text" name="item[2][email]" />

(que también es posible al agregar elementos a través de javascript)

El script php correspondiente podría verse así

function show_Names($e)
{
  return "The name is $e[name] and email is $e[email], thank you";
}

$c = array_map("show_Names", $_POST['item']);
print_r($c);
VolkerK
fuente
4

Sé que es un poco tarde ahora, pero podrías hacer algo como esto:

function AddToArray ($post_information) {
    //Create the return array
    $return = array();
    //Iterate through the array passed
    foreach ($post_information as $key => $value) {
        //Append the key and value to the array, e.g.
            //$_POST['keys'] = "values" would be in the array as "keys"=>"values"
        $return[$key] = $value;
    }
    //Return the created array
    return $return;
}

La prueba con:

if (isset($_POST['submit'])) {
    var_dump(AddToArray($_POST));
}

Esto para mí produjo:

array (size=1)
  0 => 
    array (size=5)
      'stake' => string '0' (length=1)
      'odds' => string '' (length=0)
      'ew' => string 'false' (length=5)
      'ew_deduction' => string '' (length=0)
      'submit' => string 'Open' (length=4)
Can O 'Spam
fuente
2

¿Qué pasa si tienes una variedad de conjuntos de campos?

<fieldset>
<input type="text" name="item[1]" />
<input type="text" name="item[2]" />
<input type="hidden" name="fset[]"/>
</fieldset>

<fieldset>
<input type="text" name="item[3]" />
<input type="text" name="item[4]" />
<input type="hidden" name="fset[]"/>
</fieldset>

Agregué un campo oculto para contar el número de conjuntos de campos. El usuario puede agregar o eliminar los campos y luego guardarlos.

Sophia Gavish
fuente
2

También me encontré con este problema. Dadas 3 entradas: campo [], campo2 [], campo3 []

Puede acceder a cada uno de estos campos de forma dinámica. Dado que cada campo será una matriz, todos los campos relacionados compartirán la misma clave de matriz. Por ejemplo, dados los datos de entrada:

Bob, su correo electrónico y su sexo compartirán la misma clave. Con esto en mente, puede acceder a los datos en un bucle for como este:

    for($x = 0; $x < count($first_name); $x++ )
    {
        echo $first_name[$x];
        echo $email[$x];
        echo $sex[$x];
        echo "<br/>";
    }

Esto también escala. Todo lo que necesita hacer es agregar sus respectivas variables de matriz siempre que necesite agregar nuevos campos.

ese hombre libre
fuente
0

Sin embargo, la solución de VolkerK es la mejor para evitar perder pareja entre correo electrónico y nombre de usuario. Entonces tienes que generar código HTML con PHP así:

<? foreach ($i = 0; $i < $total_data; $i++) : ?>
    <input type="text" name="name[<?= $i ?>]" />
    <input type="text" name="email[<?= $i ?>]" />
<? endforeach; ?>

Cambie $ total_data para adaptarlo a sus necesidades. Para mostrarlo, así:

$output = array_map(create_function('$name, $email', 'return "The name is $name and email is $email, thank you.";'), $_POST['name'], $_POST['email']);
echo implode('<br>', $output);

Suponiendo que los datos se enviaron mediante el método POST.

Iroel
fuente
0

No obstante, puede usar el siguiente código como,

$a = array('name1','name2','name3');
$b = array('email1','email2','email3');

function f($a,$b){
    return "The name is $a and email is $b, thank you";
}

$c = array_map('f', $a, $b);

//echoing the result

foreach ($c as $val) {
    echo $val.'<br>';
}
Abhishek Gurjar
fuente
0

Esta es fácil:

foreach( $_POST['field'] as $num => $val ) {
      print ' '.$num.' -> '.$val.' ';
    }
Ian
fuente
-4

Usar este método debería funcionar:

$name = $_POST['name'];
$email = $_POST['account'];
while($explore=each($email)) {
    echo $explore['key'];
    echo "-";
    echo $explore['value'];
    echo "<br/>";
}
Puertas de raphael
fuente
Explica tu respuesta paso a paso
krisdestruction