2009-11-19 39 views
83

Cách tốt nhất để tôi có thể truyền mảng dưới dạng tham số url là gì? Tôi đã suy nghĩ nếu có thể:Truyền mảng dưới dạng thông số url

$aValues = array(); 

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

hoặc làm thế nào về điều này:

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

Ive đọc ví dụ, nhưng tôi thấy nó lộn xộn:

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

Tại sao bạn không thể chuyển vào '$ _POST'? – random

+0

Điều này thực sự trông lộn xộn. Nhưng đối với phương pháp đó nó phải là. Cách tiếp cận khác, ít phức tạp là gán 'query = array ('aParam' => json_encode ($ arrayOfValues))'. Và bạn có thể chuyển vào url đẹp hơn với 'url_encode (implode ('/', $ query))'. Url sẽ trông giống như 'www.example.com/aParam/[va1,val2, ...]'. Khi nhận được bạn phải json_decode aParam giá trị vào mảng. –

Trả lời

174

Có một giải pháp rất đơn giản: http_build_query().Phải mất các thông số truy vấn của bạn như một mảng kết hợp:

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

sẽ trở lại

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

http_build_query() xử lý tất cả các cần thiết thoát cho bạn (%5B =>[%5D =>]), do đó chuỗi này là bằng aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.

+3

công cụ tốt, btw đây là cách facebook developpers mã hóa – tetris

+6

http_build_query cũng sẽ làm việc với các mảng lồng nhau – ndvo

+9

Nếu bạn đang tự hỏi làm thế nào để có được điều này trở lại thành một mảng, câu trả lời là [parse_str()] (http: //us1.php .net/manual/en/function.parse-str.php). – Typo

5

xin vui lòng thoát khỏi các biến của bạn khi xuất ra (urlencode).

và bạn không thể chỉ in một mảng, bạn phải xây dựng url của bạn sử dụng một vòng lặp trong một số cách

$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

Thay vì sử dụng biến "đầu tiên" để bỏ qua & đầu tiên, bạn có thể sử dụng một mảng tạm thời để lưu trữ các giá trị của mình và sử dụng các ký hiệu sau mật khẩu. Chỉ để dễ đọc. http://php.net/implode – nash

9

Cách dễ nhất là nên sử dụng các chức năng serialize.

Nó tuần tự hóa bất kỳ biến nào để lưu trữ hoặc chuyển. Bạn có thể đọc về nó trong php manual - serialize

Biến thể được phục hồi bằng cách sử dụng unserialize

Vì vậy, trong truyền đến URL bạn sử dụng:

$url = urlencode(serialize($array))

và để khôi phục lại biến bạn sử dụng

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

Be c mặc dù ở đây. Kích thước tối đa của yêu cầu GET được giới hạn ở 4k, mà bạn có thể dễ dàng vượt quá bằng cách truyền các mảng trong URL.

Ngoài ra, cách thực sự không an toàn nhất để truyền dữ liệu! Bạn có lẽ nên xem xét sử dụng các phiên thay thế.

+0

serializing cũng là một cách hay để thực hiện nó, nhưng sau đó nó ở dạng không thể đọc được nữa – knittl

+1

Yeah, serialize không thực sự là một cách làm việc sạch sẽ khi bạn làm việc với các url, bởi vì nó mở rộng dữ liệu rất nhiều. Tốt hơn là đi tùy chỉnh. – Kzqai

+0

kích thước tối đa của tham số GET là những gì tôi đã lo lắng về thats lý do tại sao tôi đã (ngớ ngẩn) hy vọng rằng các phân tích cú pháp sẽ không nhớ nếu một mảng của nó được thông qua. tôi nhận ra ngay bây giờ rằng nó sẽ không hoạt động mà không cần chạm vào kích thước tối đa. Cảm ơn anyway nash, tôi nghĩ rằng tôi sẽ làm điều đó với các phiên – uji

53

Edit: Đừng bỏ lỡ giải pháp Stefan trên, trong đó sử dụng rất tiện dụng http_build_query() chức năng: https://stackoverflow.com/a/1764199/179125

knittl là chuột phải vào khoảng thoát. Tuy nhiên, có một cách đơn giản hơn để làm điều này:

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

Nếu bạn muốn làm điều này với một mảng kết hợp, hãy thử này để thay thế:

PHP 5.3+ (lambda chức năng)

$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 (gọi lại)

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

gọn gàng! sẽ tốt đẹp nếu nó có thể làm việc với các mảng kết hợp. +1 anyway – knittl

+3

knittl: Chúng tôi có thể thực hiện điều đó bằng chức năng gọi lại tới array_map và chuyển riêng các khóa và giá trị. Kiểm tra nó ra. –

+0

nhưng điều này vẫn có thể vượt quá kích thước tối đa của tham số GET phải không? tỷ lệ cược là gì nếu tôi sử dụng các phiên thay vì giống như nash được đề cập dưới đây? – 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"; cho 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";}

print $strenc . "\n"; cho

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 

Vì vậy, nếu bạn muốn vượt qua $array này thông qua URL để page_no_2.php,

ví dụ: -

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

Để trở về mảng ban đầu, nó cần phải được urldecode(), sau đó unserialize(), như thế này trong page_no_2.php:

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

cho

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

một lần nữa: D

0

Đây không phải là một câu trả lời trực tiếp như thế này đã được trả lời, nhưng tất cả mọi người đang nói về việc gửi dữ liệu, nhưng không ai thực sự biết những gì bạn làm khi nó đến đó, và nó đã cho tôi một nửa giờ tốt để làm việc nó ra. Vì vậy, tôi nghĩ rằng tôi sẽ giúp đỡ ở đây.

tôi sẽ lặp lại chút này

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

Rõ ràng bạn sẽ định dạng nó tốt hơn so với www.someurl.com?x=$query này

Và để có được những dữ liệu trở lại

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']; 
Các vấn đề liên quan