2011-07-01 26 views
49

Estoy tratando de publicar una matriz en un campo oculto y quiero recuperar esa matriz después de enviar el formulario en php.Al pasar matriz utilizando Html Form Hidden Element

$postvalue=array("a","b","c"); 
<input type="hidden" name="result" value="<?php echo $postvalue; ?>"> 

Pero conseguir única cadena de matriz después printting el valor publicado. Entonces, ¿cómo puedo solucionarlo?

+0

Necesitas serializarlo de alguna manera. Echa un vistazo a las funciones serialize y json_encode. Recomiendo ir con el json_encode. – Gazler

Respuesta

75
$postvalue=array("a","b","c"); 
foreach($postvalue as $value) 
{ 
    echo '<input type="hidden" name="result[]" value="'. $value. '">'; 
} 

y usted tiene $_POST['result'] como un array

print_r($_POST['result']);

0

que puede hacerlo de esta manera

<input type="hidden" name="result" value="<?php foreach($postvalue as $value) echo $postvalue.","; ?>"> 
+5

O simplemente use implode ;-) – Alex

1

que es mejor para codificar primero en JSON-cadena y luego codificar con base 64, por ejemplo. en el lado del servidor en orden inverso: use first base64_decode luego funciones json_decode. por lo que restaurar su matriz PHP

1

Si desea publicar una matriz debe utilizar otra notación:

foreach ($postvalue as $value){ 
<input type="hidden" name="result[]" value="$value."> 
} 

de esta manera usted tiene tres campos de entrada con el resultado nombre [] y cuando publicado $_POST['result'] harás ser una matriz

6

De cualquier serializar:

$postvalue=array("a","b","c"); 
<input type="hidden" name="result" value="<?php echo serialize($postvalue); ?>"> 

en recepción: unserialize($_POST['result'])

o implosión:

$postvalue=array("a","b","c"); 
<input type="hidden" name="result" value="<?php echo implode(',', $postvalue); ?>"> 

en recepción: explode(',', $_POST['result'])

+0

serialize puede estropear sus cotizaciones o corchetes y mezclar con html .. Utilizaría la respuesta aceptada – zachu

19

Existen principalmente dos formas posibles para lograr esto:

  1. Serialize los datos de alguna manera:

    $postvalue = serialize($array); // client side 
    
    $array = unserialize($_POST['result']; //server side 
    

    Y entonces se puede serializar los valores publicados con unserialize($postvalue) más información sobre este tema es here in the php manuals.

    Alternativley puede usar las funciones json_encode() y json_decode() para obtener una cadena serializada con formato json. Incluso se puede reducir el tamaño de los datos transmitidos con gzcompress() (nota que este es el rendimiento intensivo) y asegurar los datos transmitidos con base64_encode() (para que los datos sobreviven en las capas de transporte limpios no de 8 bits) Esto podría tener este aspecto:

    $postvalue = base64_encode(json_encode($array)); //client side 
    
    $array = json_decode(base64_decode($_POST['result'])); //server side 
    

    Una forma no recomendada de serializar sus datos (pero de rendimiento muy económico) es simplemente usar implode() en su matriz para obtener una cadena con todos los valores separados por algún carácter especificado. En el servidor, puede recuperar la matriz con explode() y luego. Pero tenga en cuenta que no debe utilizar un carácter para la separación que se produce en los valores de la matriz (o luego escapar de ella) y que no puede transmitir las claves de la matriz con este método.

  2. utilizar las propiedades de los elementos de entrada nombrados especiales:

    $postvalue = ""; 
    foreach ($array as $v) { 
        $postvalue .= '<input type="hidden" name="result[]" value="' .$v. '" />'; 
    } 
    

    como no te toda la matriz en la variable $_POST['result'] Si se envía el formulario. Tenga en cuenta que esto no transmite las teclas de matriz. Sin embargo, puede lograrlo utilizando result[$key] como nombre de cada campo.

Cada uno de estos métodos tiene sus propias ventajas y desventajas. Lo que utiliza depende principalmente de cuán grande será su matriz, ya que debe intentar enviar una cantidad mínima de datos con todos estos métodos.

Otra forma de lograr lo mismo es almacenar la matriz en una sesión del lado del servidor en lugar de transmitirla desde el lado del cliente. De esta manera, puedes acceder a la matriz sobre la variable $_SESSION y no tienes que transmitir nada sobre el formulario. Por esta echar un vistazo a a basic usage example of sessions on php.net

+0

Tuve que usar comillas simples alrededor del atributo 'value'. De lo contrario, los datos se recortaban en la primera cita doble en la versión serializada. – VeeK

+0

Lo hice usando json_encode. El segundo argumento para [json_decode] (http://php.net/manual/en/function.json-decode.php) tenía que ser verdadero en mi caso (para devolver una matriz asociativa en lugar de StdClass como el predeterminado) – jamil

1
<input type="hidden" name="item[]" value="[anyvalue]"> 

que sea en un modo repetido publicará este elemento en la forma como una matriz y utilizar el

print_r($_POST['item']) 

Para recuperar el elemento

9

Puede usar serialize y base64_encode desde el lado del cliente, Luego, utilice unserialize y base64_decode al lado del servidor Como:

En el uso del lado del cliente:

$postvalue=array("a","b","c"); 
    $postvalue = base64_encode(serialize($array)); 

    //your form hidden input 
    <input type="hidden" name="result" value="<?php echo $postvalue; ?>"> 

En el uso del lado del servidor:

$postvalue = unserialize(base64_decode($_POST['result'])); 
    print_r($postvalue) //your desired array data will be printed here 
+0

Esto debería ser sea ​​la respuesta correcta, mejor que usar foreach, puede pasar objetos a matrices y matrices de varios niveles –

+0

Esta respuesta no recibe suficiente crédito. ** Solo ** usar serialize() o json_encode() son cosas que la mayoría de la gente ha intentado y se dan cuenta que fallan sobre la base de las comillas cuando llegan aquí. Esta respuesta va un paso más allá y la codifica de una manera que hace que ese tema sea irrelevante de una manera elegante. ** ¡Bravo! ** – Kaji

+0

Estoy de acuerdo, esta debería ser la respuesta correcta – barakadam

Cuestiones relacionadas