2011-07-01 9 views
49

Próbuję opublikować tablicę w ukrytym polu i chcę pobrać tę tablicę po przesłaniu formularza w php.Przekazywanie tablicy przy użyciu ukrytego elementu formularza Html

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

Ale uzyskanie tylko ciągu tablicowego po wydrukowaniu zaksięgowanej wartości. Jak mogę to rozwiązać?

+0

Trzeba szeregować je w jakiś sposób. Sprawdź funkcje serializacji i json_encode. Polecam idąc z json_encode. – Gazler

Odpowiedz

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

i masz $_POST['result'] jako tablicy

print_r($_POST['result']);

0

można to zrobić jak ten

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

Lub po prostu użyj implode ;-) – Alex

1

to lepiej najpierw zakodować do JSON-string, a następnie zakodować z base64 np. po stronie serwera w odwrotnej kolejności: użyj najpierw funkcji base64_decode, a następnie json_decode. więc można przywrócić tablicę php

1

Jeśli chcesz zamieścić tablicę należy użyć innego określenia:

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

w ten sposób masz trzy pola wejściowe z wynikiem nazwa [], a gdy pisał $_POST['result'] będzie być tablicą

6

Albo serialize:

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

na otrzymują: unserialize($_POST['result'])

lub implode:

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

na otrzymują: explode(',', $_POST['result'])

+0

serializować może zepsuć twoje cytaty lub nawiasy i pomieszać z html .. Używałbym zaakceptowanej odpowiedzi – zachu

19

Istnieją głównie dwa sposoby osiągnięcia tego celu:

  1. Serializować dane w jakiś sposób:

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

    a następnie można unserialize zaksięgowanych wartości z unserialize($postvalue) Więcej informacji na ten temat jest here in the php manuals.

    Alternativley można użyć funkcji json_encode() i json_decode(), aby uzyskać sformatowany ciąg w formacie json. Można nawet kurczyć transmitowanych danych z gzcompress() (zauważ, że jest to wydajność intensywny) i zabezpieczyć przesyłane dane z base64_encode() (aby dane przeżyć w non-8bit czystych warstw transportowych) Mogłoby to wyglądać tak:

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

    Nie zalecanym sposobem przekształcania danych (ale bardzo taniego działania) jest użycie w swojej tablicy implode(), aby uzyskać ciąg znaków z wszystkimi wartościami oddzielonymi przez określony znak. Na serwerze możesz pobrać tablicę z explode(). Zauważ, że nie powinieneś używać znaku do separacji, który występuje w wartościach tablicowych (lub uciekać), i że nie możesz transmitować kluczy tablicy tą metodą.

  2. Użyj właściwości szczególnych wymienionych elementów wejściowych:

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

    Podoba Ci to cała tablica w zmiennej $_POST['result'] jeśli formularz jest przesyłany. Zauważ, że to nie przenosi kluczy tablicy. Można to jednak osiągnąć, używając nazwy result[$key] jako nazwy każdego pola.

Każda z tych metod ma swoje zalety i wady. To, czego używasz, zależy głównie od tego, jak duża będzie twoja tablica, ponieważ powinieneś spróbować wysłać minimalną ilość danych za pomocą wszystkich tych metod.

Innym sposobem na osiągnięcie tego samego jest przechowywanie tablicy w sesji po stronie serwera zamiast przesyłania jej po stronie klienta. W ten sposób można uzyskać dostęp do tablicy za pomocą zmiennej $_SESSION i nie trzeba transmitować niczego w formularzu. W tym celu spojrzeć na a basic usage example of sessions on php.net

+0

Musiałem użyć pojedynczych cudzysłowów wokół atrybutu 'value'. W przeciwnym razie dane były przycinane przy pierwszym podwójnym cudzysłowie w wersji zserializowanej. – VeeK

+0

Zrobiłem to za pomocą json_encode. Drugi argument dla [json_decode] (http://php.net/manual/en/function.json-decode.php) musiał być prawdziwy w moim przypadku (aby zwrócić tablicę asocjacyjną zamiast StdClass jako domyślną) – jamil

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

Niech będzie w wielokrotnym trybie będzie pisać ten element w postaci tablicy i użyć

print_r($_POST['item']) 

Aby odzyskać przedmiot

9

Możesz użyć serializacji i base64_encode ze strony klienta, Po tym czasie użyj unserialize i base64_decode do strony serwera Tak jak:

W użyciu po stronie klienta:

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

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

W użyciu stronie serwera:

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

To powinno być poprawną odpowiedzią, lepiej niż użyć foreach, można przekazywać obiekty do tablic i wielopoziomowych tablic –

+0

Ta odpowiedź nie jest wystarczająco duża. ** Po prostu ** przy użyciu serialize() lub json_encode() są rzeczy, które większość ludzi próbowała i zdaje sobie sprawę z tego, że nie powiodło się na podstawie cudzysłowów do czasu, gdy dotarli tutaj. Odpowiedź ta idzie o krok dalej i koduje ją w sposób, który czyni tę kwestię nieistotną w elegancki sposób. ** Bravo! ** – Kaji

+0

Zgadzam się, to powinna być poprawna odpowiedź – barakadam

Powiązane problemy