URL 매개 변수로 배열 전달


115

배열을 url 매개 변수로 전달할 수있는 가장 좋은 방법은 무엇입니까? 이것이 가능하다면 생각했습니다.

$aValues = array();

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

또는 이것에 대해 :

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

예를 읽었지만 지저분합니다.

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

2
왜 그냥 지나칠 수 $_POST없습니까?
무작위

이것은 정말 지저분 해 보입니다. 그러나 그 접근 방식은 그래야만합니다. 다른 접근 방식은 query = array('aParam'=> json_encode($arrayOfValues)). 그리고 더 좋은 URL을 url_encode(implode('/',$query)). URL은 다음과 같습니다 www.example.com/aParam/[va1,val2,...]. 수신 할 때 aParam 값을 배열로 json_decode해야합니다.
Vladimir Vukanac

답변:


220

아주 간단한 해결책이 있습니다 : http_build_query(). 쿼리 매개 변수를 연관 배열로 사용합니다.

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

돌아올 것이다

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

http_build_query()필요한 모든 이스케이프 ( %5B=> [%5D=> ])를 처리하므로이 문자열은 aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.


16
이것을 배열로 되 돌리는 방법이 궁금하다면 대답은 parse_str () 입니다.
Typo

1
나는 이것을 사용하여 URL을 배열에 넣었지만 데이터를 다시 얻는 방법을 모르겠습니다. 나는 parse_str을 시도했지만 작동하지 못했습니다. 나는이 귀중한 정보가 될 것이라고 생각
토마스 윌리엄스

2
http_build_query반품 param[]및 수시로 문제가 발생하는 모든 사람을 위해 param[index]. 이 게시물을 확인하십시오 : stackoverflow.com/questions/11996573/…
stwhite

2
값을 되돌리려면 $ data = $ _GET [ 'aParam'];
dfortun

@dfortun get back은 당신이 많은 시간을 절약하는 것이 중요합니다 parse_str ()은 저를 위해 작동하지 않았지만 $ data = $ _GET [ 'aParam']; 올바른 솔루션입니다
Asesha 조지

56

편집 : 매우 편리한 http_build_query()기능 을 사용하는 위의 Stefan의 솔루션을 놓치지 마십시오 : https://stackoverflow.com/a/1764199/179125

knittl은 탈출에 대해 옳습니다. 그러나이를 수행하는 더 간단한 방법이 있습니다.

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

연관 배열로이 작업을 수행하려면 대신 다음을 시도하십시오.

PHP 5.3 이상 (람다 함수)

$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 (콜백)

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
산뜻한! 연관 배열에서도 작동 할 수 있다면 좋을 것입니다. 어쨌든 +1
knittl

3
knittl : array_map에 콜백 함수를 사용하고 키와 값을 별도로 전달할 수 있습니다. 확인 해봐.
Jordan Running

그러나 이것은 여전히 ​​GET 매개 변수의 최대 크기를 초과 할 수 있습니까? 아래 언급 된 nash와 같이 세션을 대신 사용하면 확률은 얼마입니까?
uji

글쎄, 당신은 세션에 다소 무제한의 데이터를 저장할 수 있습니다. 세션의 위험은 세션이 만료되거나 사용자가 한 번에 두 개의 탭에서 작업을 시도하는 경우 URL이 깨지는 것입니다. 사용자가 페이지를 북마크 한 다음 세션이 만료 된 후 다시 돌아 오면 원하는 페이지를 계속 얻을 수 있습니까? 아키텍처에 대해 더 열심히 생각해야 할 것 같고 애초에 왜 그렇게 거대한 배열을 지나가는 지에 대해 생각해야 할 것 같습니다.
Jordan Running

이 답변을 게시 한 지 1 년 후에 좋은 답변을 +1하고 나를 위해 일했습니다.
Naveed

10

가장 쉬운 방법은 serialize기능 을 사용하는 것입니다.

저장 또는 전송을 위해 모든 변수를 직렬화합니다. PHP 매뉴얼 에서 읽을 수 있습니다 -직렬화

변수는 다음을 사용하여 복원 할 수 있습니다. unserialize

따라서 URL을 전달할 때 다음을 사용합니다.

$url = urlencode(serialize($array))

사용하는 변수를 복원하려면

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

그래도 여기서 조심하십시오. GET 요청의 최대 크기는 4k로 제한되며 URL에서 배열을 전달하여 쉽게 초과 할 수 있습니다.

또한 데이터를 전달하는 가장 안전한 방법은 아닙니다! 대신 세션을 사용하는 것이 좋습니다.


일련의 순차적 인은 그 일의 좋은 방법이지만, 그것은 더 이상 그리 읽을 수없는 형태입니다
knittl

1
예, 직렬화는 데이터를 너무 많이 확장하기 때문에 URL로 작업 할 때 작업을 수행하는 정말 깨끗한 방법이 아닙니다. 맞춤 설정하는 것이 좋습니다.
Kzqai

GET 매개 변수의 최대 크기는 내가 걱정했던 것이므로 파서가 전달되는 배열이면 신경 쓰지 않기를 바랬습니다. 나는 그것이 최대 크기를 건드리지 않으면 작동하지 않는다는 것을 방금 깨달았습니다. 어쨌든 감사합니다 nash, 나는 세션으로 그것을 할 것이라고 생각합니다
uji

4
unserialize ()에 신뢰할 수없는 데이터를 전달해서는 안됩니다. 대신 json_encode () 및 json_decode ()를 사용해보십시오.
Mikko Rantalainen

6

( urlencode)를 출력 할 때 변수를 이스케이프하십시오 .

배열 만 인쇄 할 수는 없습니다. 어떤 방식 으로든 루프를 사용하여 URL을 만들어야합니다.

$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
첫 번째 & amp;를 건너 뛰기 위해 "first"변수를 사용하는 대신 임시 배열을 사용하여 값을 저장하고 implode 뒷 단어를 사용할 수 있습니다. 가독성을 위해. 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"; 제공 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"; 준다

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

그래서 당신이 전달하려는 경우 $array에 URL을 통해 page_no_2.php,

전의:-

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

원래 배열로 돌아가려면 urldecode()다음 unserialize()과 같아야합니다. 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"
}

다시 : D



1

이것은 이미 답변을 받았기 때문에 직접적인 대답은 아니지만 모두가 데이터를 보내는 것에 대해 이야기하고 있었지만 아무도 데이터가 도착했을 때 당신이하는 일을 실제로 말하지 않았고 그것을 해결하는 데 30 분 정도 걸렸습니다. 그래서 여기서 도와 주겠다고 생각했습니다.

이 비트를 반복하겠습니다

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

분명히이 www.someurl.com?x=$query보다 더 나은 형식을 지정할 것입니다.

그리고 데이터를 되찾기 위해

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'];

0

받은 페이지에서 다음을 사용할 수 있습니다.

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


Stack Overflow에 오신 것을 환영합니다. 다른 8 개의 답변이있는 10 년 된 질문에 대한 답변을 추가 할 때 질문의 새로운 측면이 무엇인지 지적하는 것이 매우 중요합니다. 지금은 다른 답변 중 하나에 이미 포함 된 코드 전용 답변이있는 것 같습니다. 향후 답변에서 코드 서식을 사용하십시오.
Jason Aller

0

이것은이 문제를 해결하는 또 다른 방법입니다.

$data = array(
              1,
              4,
             'a' => 'b',
             'c' => 'd'
              );
$query = http_build_query(array('aParam' => $data));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.