2009-11-19 30 views
83

Qual è il modo migliore in cui posso passare un array come parametro url? Stavo pensando se questo è possibile:Passare gli array come parametro url

$aValues = array(); 

$url = 'http://www.example.com?aParam='.$aValues; 

o come su questo:

$url = 'http://www.example.com?aParam[]='.$aValues; 

Ho letto esempi, ma trovo disordinato:

$url = 'http://www.example.com?aParam[]=value1&aParam[]=value2&aParam[]=value3'; 
+1

Perché non puoi passare in '$ _POST'? – random

+0

Questo sembra davvero disordinato. Ma per quell'approccio deve essere. Un altro approccio, poco complicato, è assegnare 'query = array ('aParam' => json_encode ($ arrayOfValues))'. E che puoi passare in url più bello con 'url_encode (implode ('/', $ query))'. Url avrà l'aspetto 'www.esempio.it/aParam/[va1,val2, ...]'. Durante la ricezione devi json_decode il valore di aParam in array. –

risposta

174

C'è una soluzione molto semplice: http_build_query().Ci vogliono i tuoi parametri di query come un array associativo:

$data = array(
    1, 
    4, 
    'a' => 'b', 
    'c' => 'd' 
); 
$query = http_build_query(array('aParam' => $data)); 

tornerà

string(63) "aParam%5B0%5D=1&aParam%5B1%5D=4&aParam%5Ba%5D=b&aParam%5Bc%5D=d" 

http_build_query() gestisce tutto il necessario fuga per voi (%5B =>[ e %5D =>]), quindi questa stringa è uguale a aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.

+3

buona roba, btw questo è il modo in cui gli sviluppatori di Facebook codificano – tetris

+6

http_build_query funzionerà anche con gli array annidati – ndvo

+9

Se ti stai chiedendo come riportarlo in un array, la risposta è [parse_str()] (http: //us1.php .net/manuale/it/function.parse-str.php). – Typo

5

si prega di sfuggire le variabili quando l'output (urlencode).

e non si può semplicemente stampare un array, è necessario costruire il vostro URL utilizzando un ciclo in qualche modo

$url = 'http://example.com/index.php?' 
$first = true; 
foreach($aValues as $key => $value) { 
    if(!$first) $url .= '&amp'; 
    else $first = false; 
    $url .= 'aValues['.urlencode($key).']='.urlencode($value); 
} 
+1

Invece di utilizzare una "prima" variabile per ignorare il primo &, è possibile utilizzare una matrice temporanea per memorizzare i valori e utilizzare le parole successive di implode. Solo per la leggibilità. http://php.net/implode La serializzazione – nash

9

modo più semplice sarebbe quella di utilizzare la funzione serialize.

Serializza qualsiasi variabile per la memorizzazione o il trasferimento. Si può leggere su di esso nel php manual - serialize

La variabile può essere ripristinato utilizzando unserialize

Così nel passaggio all'URL si utilizza:

$url = urlencode(serialize($array))

e per ripristinare la variabile si utilizza

$var = unserialize(urldecode($_GET['array']))

essere C sono comunque qui. La dimensione massima di una richiesta GET è limitata a 4k, che puoi facilmente superare passando gli array in un URL.

Inoltre, non è proprio il modo più sicuro per trasmettere i dati! Probabilmente dovresti cercare di usare le sessioni.

+0

è anche un bel modo per farlo, ma in quel momento è in una forma non più leggibile – knittl

+1

Sì, serializzare non è un modo veramente pulito di fare le cose quando sei lavorando con gli URL, perché espande così tanto i dati. Meglio andare su misura. – Kzqai

+0

la dimensione massima del parametro GET era quello che mi preoccupava di quello che ero (stupidamente) sperando che il parser non si preoccupasse se fosse un array che è passato. mi sono reso conto solo ora che non funzionerà senza toccare la dimensione massima. Grazie comunque nash, penso che lo farò con le sessioni – uji

53

Edit: Non perdere soluzione di Stefan sopra, che utilizza la funzione molto utile http_build_query(): https://stackoverflow.com/a/1764199/179125

Knittl è proprio su di fuggire. Tuttavia, c'è un modo più semplice per fare questo:

$url = 'http://example.com/index.php?'; 
$url .= 'aValues[]=' . implode('&aValues[]=', array_map('urlencode', $aValues)); 

Se si vuole fare questo con un array associativo, provate questo invece:

PHP 5.3+ (funzione lambda)

$url = 'http://example.com/index.php?'; 
$url .= implode('&', array_map(function($key, $val) { 
    return 'aValues[' . urlencode($key) . ']=' . urlencode($val); 
    }, 
    array_keys($aValues), $aValues) 
); 

PHP < 5.3 (callback)

function urlify($key, $val) { 
    return 'aValues[' . urlencode($key) . ']=' . urlencode($val); 
} 

$url = 'http://example.com/index.php?'; 
$url .= implode('&amp;', array_map('urlify', array_keys($aValues), $aValues)); 
+1

pulito! sarebbe bello se potesse funzionare anche con gli array associativi. +1 comunque – knittl

+3

knittl: Possiamo farlo con una funzione di callback per array_map e passando separatamente chiavi e valori. Controlla. –

+0

ma questo potrebbe ancora superare la dimensione massima del parametro GET giusto? Quali sono le probabilità se uso sessioni invece proprio come nash di seguito indicato? – uji

2
<?php 
$array["a"] = "Thusitha"; 
$array["b"] = "Sumanadasa"; 
$array["c"] = "Lakmal"; 
$array["d"] = "Nanayakkara"; 

$str = serialize($array); 
$strenc = urlencode($str); 
print $str . "\n"; 
print $strenc . "\n"; 
?> 

print $str . "\n";a:4:{s:1:"a";s:8:"Thusitha";s:1:"b";s:10:"Sumanadasa";s:1:"c";s:6:"Lakmal";s:1:"d";s:11:"Nanayakkara";} e

print $strenc . "\n";

a%3A4%3A%7Bs%3A1%3A%22a%22%3Bs%3A8%3A%22Thusitha%22%3Bs%3A1%3A%22b%22%3Bs%3A10%3A%22Sumanadasa%22%3Bs%3A1%3A%22c%22%3Bs%3A6%3A%22Lakmal%22%3Bs%3A1%3A%22d%22%3Bs%3A11%3A%22Nanayakkara%22%3B%7D 

Quindi, se si vuole passare questo $array attraverso URL page_no_2.php,

es: -

$url ='http://page_no_2.php?data=".$strenc."'; 

Per tornare alla matrice originale, deve essere urldecode(), quindi unserialize(), come questo in page_no_2.php:

<?php 
    $strenc2= $_GET['data']; 
    $arr = unserialize(urldecode($strenc2)); 
    var_dump($arr); 
    ?> 

array(4) { 
    ["a"]=> 
    string(8) "Thusitha" 
    ["b"]=> 
    string(10) "Sumanadasa" 
    ["c"]=> 
    string(6) "Lakmal" 
    ["d"]=> 
    string(11) "Nanayakkara" 
} 

ancora: D

0

Questa non è una risposta diretta come questo è già stato risposto, ma tutti parlavano di inviare i dati, ma nessuno veramente detto quello che fai quando arriva, e mi ci è voluta una buona mezz'ora per risolverlo. Quindi ho pensato di aiutare qui.

Ripeterò questo bit

$data = array(
'cat' => 'moggy', 
'dog' => 'mutt' 
); 
$query = http_build_query(array('mydata' => $data)); 
$query=urlencode($query); 

Ovviamente si sarebbe formattarlo meglio di questo www.someurl.com?x=$query

E per ottenere i dati storici

parse_str($_GET['x']); 
echo $mydata['dog']; 
echo $mydata['cat']; 
0
**in create url page** 

$data = array(
     'car' => 'Suzuki', 
     'Model' => '1976' 
     ); 
$query = http_build_query(array('myArray' => $data)); 
$url=urlencode($query); 

echo" <p><a href=\"index2.php?data=".$url."\"> Send </a><br /> </p>"; 

**in received page** 

parse_str($_GET['data']); 
echo $myArray['car']; 
echo '<br/>'; 
echo $myArray['model']; 
Problemi correlati