Meneruskan array sebagai parameter url

115

Apa cara terbaik agar saya dapat mengirimkan array sebagai parameter url? Saya berpikir apakah ini mungkin:

$aValues = array();

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

atau bagaimana dengan ini:

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

Saya sudah membaca contoh, tapi menurut saya berantakan:

$url = 'http://www.example.com?aParam[]=value1&aParam[]=value2&aParam[]=value3';
uji
sumber
2
Mengapa Anda tidak bisa lewat begitu saja $_POST?
acak
Ini benar-benar terlihat berantakan. Tetapi untuk pendekatan itu, harus demikian. Pendekatan lain, sedikit rumit adalah untuk menetapkan query = array('aParam'=> json_encode($arrayOfValues)). Dan Anda dapat mengirimkan url yang lebih bagus dengan url_encode(implode('/',$query)). Url akan terlihat seperti www.example.com/aParam/[va1,val2,...]. Saat menerima Anda harus json_decode nilai aParam ke dalam array.
Vladimir Vukanac

Jawaban:

220

Ada solusi yang sangat sederhana: http_build_query(). Ini mengambil parameter kueri Anda sebagai array asosiatif:

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

akan kembali

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

http_build_query()menangani semua pelolosan yang diperlukan untuk Anda ( %5B=> [dan %5D=> ]), jadi string ini sama dengan aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.

Stefan Gehrig
sumber
16
Jika Anda bertanya-tanya bagaimana cara mengembalikannya ke dalam array, jawabannya adalah parse_str () .
Typo
1
Saya telah menggunakan ini untuk meletakkan url dalam array tetapi tidak tahu bagaimana mendapatkan data kembali. Saya mencoba parse_str dan tidak dapat membuatnya berfungsi. Saya pikir ini akan menjadi informasi yang berharga
Thomas Williams
2
Untuk siapa pun yang mengalami masalah dengan http_build_querykembali param[]dan kadang-kadang param[index]. Lihat posting ini: stackoverflow.com/questions/11996573/…
stwhite
2
untuk mendapatkan kembali nilainya Anda hanya perlu $ data = $ _GET ['aParam'];
dfortun
@dfortun mendapatkan kembali adalah penting Anda menghemat banyak waktu parse_str () tidak berfungsi untuk saya tetapi $ data = $ _GET ['aParam']; adalah solusi yang benar
Asesha George
56

Sunting: Jangan lewatkan solusi Stefan di atas, yang menggunakan fungsi yang sangat berguna http_build_query(): https://stackoverflow.com/a/1764199/179125

knittl benar tentang melarikan diri. Namun, ada cara yang lebih sederhana untuk melakukan ini:

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

Jika Anda ingin melakukan ini dengan array asosiatif, coba ini sebagai gantinya:

PHP 5.3+ (fungsi 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 (panggilan balik)

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));
Jordan Running
sumber
1
rapi! akan lebih baik jika itu bisa bekerja dengan array asosiatif juga. +1 tetap
knittl
3
knittl: Kita bisa melakukannya dengan fungsi callback ke array_map dan meneruskan kunci dan nilai secara terpisah. Saksikan berikut ini.
Jordan Tayang
tapi ini masih bisa melebihi ukuran maksimal dari parameter GET kan? Apa kemungkinannya jika saya menggunakan sesi seperti nash yang disebutkan di bawah ini?
uji
Nah, Anda bisa menyimpan data yang jumlahnya kurang lebih tidak terbatas dalam satu sesi. Risiko sesi ada di URL yang rusak saat sesi berakhir, atau jika pengguna mencoba melakukan sesuatu misalnya di dua tab sekaligus. Jika pengguna mem-bookmark halaman, lalu kembali setelah sesi mereka berakhir, apakah mereka masih akan mendapatkan halaman yang mereka harapkan? Kedengarannya seperti Anda mungkin perlu berpikir lebih keras tentang arsitektur Anda dan mengapa Anda melewati array yang begitu besar di tempat pertama.
Jordan Tayang
+1 jawaban yang bagus dan bekerja untuk saya juga setelah satu tahun memposting jawaban ini.
Naveed
10

Cara termudah adalah dengan menggunakan serializefungsi tersebut.

Ini membuat serial variabel apa pun untuk penyimpanan atau transfer. Anda dapat membacanya di manual php - serialize

Variabel dapat dikembalikan dengan menggunakan unserialize

Jadi saat meneruskan ke URL yang Anda gunakan:

$url = urlencode(serialize($array))

dan untuk mengembalikan variabel yang Anda gunakan

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

Berhati-hatilah di sini. Ukuran maksimum permintaan GET dibatasi hingga 4k, yang dapat dengan mudah Anda lewati dengan meneruskan array di URL.

Selain itu, ini bukanlah cara teraman untuk menyampaikan data! Anda mungkin harus melihat menggunakan sesi sebagai gantinya.

nash
sumber
serialisasi juga merupakan cara yang bagus untuk melakukannya, tetapi kemudian dalam bentuk yang tidak terlalu bisa dibaca lagi
knittl
1
Ya, membuat serial bukanlah cara yang bersih untuk melakukan sesuatu saat Anda bekerja dengan url, karena ini memperluas data begitu banyak. Lebih baik lakukan custom.
Kzqai
ukuran maksimal dari parameter GET adalah apa yang saya khawatirkan tentang itulah mengapa saya (bodoh) berharap bahwa parser tidak keberatan jika sebuah array yang dilewatkan. Saya baru saja menyadari bahwa itu tidak akan berfungsi tanpa menyentuh ukuran maksimal. Terima kasih nash, saya pikir saya akan melakukannya dengan sesi
uji
4
Anda sebaiknya tidak meneruskan data tidak tepercaya ke unserialize (). Coba json_encode () dan json_decode () sebagai gantinya.
Mikko Rantalainen
6

tolong tinggalkan variabel Anda saat mengeluarkan ( urlencode).

dan Anda tidak bisa hanya mencetak larik, Anda harus membangun url Anda menggunakan loop dalam beberapa cara

$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);
}
rajutan
sumber
1
Alih-alih menggunakan variabel "pertama" untuk melewati & amp; pertama, Anda dapat menggunakan larik sementara untuk menyimpan nilai Anda, dan menggunakan implode afterwords. Hanya untuk keterbacaan. php.net/implode
nash
5
 <?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"; memberi 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";} dan

print $strenc . "\n"; memberi

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

Jadi jika Anda ingin meneruskan ini $arraymelalui URL ke page_no_2.php,

ex:-

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

Untuk kembali ke larik asli, itu perlu urldecode(), lalu unserialize(), seperti ini di page_no_2.php:

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

memberi

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

lagi: D

Thusitha Sumanadasa
sumber
1

Ini bukan jawaban langsung karena ini telah dijawab, tetapi semua orang berbicara tentang pengiriman data, tetapi tidak ada yang benar-benar mengatakan apa yang Anda lakukan ketika sampai di sana, dan saya butuh waktu setengah jam untuk menyelesaikannya. Jadi saya pikir saya akan membantu di sini.

Saya akan mengulang sedikit ini

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

Jelas Anda akan memformatnya lebih baik daripada www.someurl.com?x=$query ini

Dan untuk mendapatkan datanya kembali

parse_str($_GET['x']);
echo $mydata['dog'];
echo $mydata['cat'];
Thomas Williams
sumber
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'];
pengguna2638158
sumber
0

di halaman yang diterima, Anda dapat menggunakan:

parse_str ($ str, $ array); var_dump ($ larik);

CarlosP
sumber
Selamat datang di Stack Overflow. Saat menambahkan jawaban untuk pertanyaan sepuluh tahun dengan delapan jawaban lainnya, sangat penting untuk menunjukkan aspek baru apa dari pertanyaan yang dijawab oleh jawaban Anda. Saat ini sepertinya Anda memiliki jawaban hanya kode yang telah dicakup oleh salah satu jawaban lain. Harap gunakan pemformatan kode untuk kode di jawaban mendatang.
Jason Aller
0

Ini adalah cara lain untuk memecahkan masalah ini.

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