[php] URL 매개 변수로 배열 전달

배열을 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';



답변

아주 간단한 해결책이 있습니다 : 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.


답변

편집 : 매우 편리한 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));


답변

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

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

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

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

$url = urlencode(serialize($array))

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

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

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

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


답변

( 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);
}


답변

 <?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


답변

직렬화 된 데이터 base64로 인코딩하여이 작업을 수행합니다. 가장 좋고 가장 작은 방법이라고 생각합니다. urlencode는 많은 공간을 낭비하고 있으며 4k 만 있습니다.


답변

이것은 이미 답변을 받았기 때문에 직접적인 대답은 아니지만 모두가 데이터를 보내는 것에 대해 이야기하고 있었지만 아무도 데이터가 도착했을 때 당신이하는 일을 실제로 말하지 않았고 그것을 해결하는 데 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'];