쿼리 문자열을 배열로 구문 분석


195

아래 문자열을 배열 로 바꾸려면 어떻게 해야합니까?

pg_id=2&parent_id=2&document&video 

이것은 내가 찾고있는 배열입니다.

array(
    'pg_id' => 2,
    'parent_id' => 2,
    'document' => ,
    'video' =>
)

답변:


330

parse_str함수를 원하고 개별 변수 대신 배열에 데이터를 넣도록 두 번째 매개 변수를 설정해야합니다.

$get_string = "pg_id=2&parent_id=2&document&video";

parse_str($get_string, $get_array);

print_r($get_array);

2
동일한 키를 여러 번 사용하면 작동하지 않기 때문에이 답변에 문제가 있습니다 (예 : PHP 배열 키는 고유하기 때문에). 그래서 ?key=lorem&key=ipsum발생합니다 array(["key"]=>"ipsum")질문은, s.th.를 얻을 수있는 기능이 있습니다 이 같은 array(["key"]=>array("lorem", "ipsum"))또는 내 자신 에이 기능을 만들어야합니까?
MaBi

11
기술적으로 PHP는 URL에 쿼리 문자열 인 경우 ?key=lorem&key=ipsum에만 제공 한 key=ipsum것처럼 처리합니다. 그리고 키를 재사용하고 일관된 결과를 기대하거나 키의 모든 인스턴스가 유지되는 것은 유효하지 않다고 생각합니다. 적어도 PHP로 전송되는 쿼리 문자열에 대한 유효한 접근 방식은 다음 ?key[]=lorem&key[]=ipsum과 같습니다. 따라서 자체 개발 접근 방식은 &{x}=x가 두 번 이상 발생하고 x[](및?와 동일하게 처리) 대체되는 부분을 찾을 수 있습니다.
Anthony

9
@ 마비-아, 그리고 다른 사람이 당신과 동의하고 이미 자신의 기능을 만들었습니다 -php.net/manual/en/function.parse-str.php#76792
Anthony

도움이되었습니다! 나는 ?key[]=lorem&key[]=ipsum몇 주 전에 이것을 이렇게하기로 결정했습니다 . 그러나 링크를 공유해 주셔서 감사합니다!
MaBi

2
주의해야 할 것은 myemail+alias@gmail.com과 같이 '+'를 포함하는 문자열입니다. 이들은 parse_str에 의해 공백으로 구문 분석됩니다. key = myemail alias@gmail.com.
dudeman

62

때로는 parse_str()혼자 정확한 메모가 표시됩니다.

$url = "somepage?id=123&lang=gr&size=300";

parse_str ()은 다음을 반환합니다.

Array ( 
    [somepage?id] => 123 
    [lang] => gr 
    [size] => 300 
)

다음 parse_str()parse_url()같이 결합 하는 것이 좋습니다 .

$url = "somepage?id=123&lang=gr&size=300";
parse_str( parse_url( $url, PHP_URL_QUERY), $array );
print_r( $array );

3
나는 그것이 기대하고 있다고 생각합니다$_SERVER['QUERY_STRING']
CpILL

문자열 URL에 배열하는 방법 ex. : 배열 ([somepage? id] => 123 [lang] => gr [size] => 300) 출력 = somepage? id = 123 & lang = gr & size = 300
mehul



17

인코딩 된 앰퍼샌드로 인해 쿼리 문자열을 배열로 변환하는 데 문제가있는 경우

&

그런 다음 사용하십시오 html_entity_decode

예:

// Input string //
$input = 'pg_id=2&parent_id=2&document&video';

// Parse //
parse_str(html_entity_decode($input), $out);

// Output of $out //
array(
  'pg_id' => 2,
  'parent_id' => 2,
  'document' => ,
  'video' =>
)


3

이것은 현재 URL에서 배열로 쿼리를 파싱하기위한 하나의 라이너입니다.

parse_str($_SERVER['QUERY_STRING'], $query);

1

PHP 문자열 함수 parse_str()다음에 foreach루프를 사용할 수 있습니다 .

$str="pg_id=2&parent_id=2&document&video";
parse_str($str,$my_arr);
foreach($my_arr as $key=>$value){
  echo "$key => $value<br>";
}
print_r($my_arr);

-3

이것은 mysql & mssql에서 쿼리를 분할하는 PHP 코드입니다.

enter code here
function splitquery($strquery)
{
$arrquery=explode('select',$strquery);

$stry='';$strx='';

for($i=0;$i<count($arrquery);$i++)
{
if($i==1)
{
    echo 'select '.trim($arrquery[$i]);
}
elseif($i>1)
{

$strx=trim($arrquery[($i-1)]);

    if(trim(substr($strx,-1))!='(')
    {
        $stry=$stry.'

select '.trim($arrquery[$i]);
    }
    else
    {
        $stry=$stry.trim('select '.trim($arrquery[$i]));
    }

$strx='';
}
} 

return $stry;
}

예:

전에 쿼리

xx에서 xx를 선택하십시오. xx에서 xx를 선택하십시오 (xx에서 xx를 선택하십시오) 여기서 y = 'cc'xx에서 xx를 선택하십시오.

이후 쿼리

xx에서 xx를 선택하십시오

xx를 선택하고 xx에서 (xx를 선택) 여기서 y = 'cc'

xx 왼쪽 조인에서 xx 선택 (xx 선택) 여기서 xxx에서 상위 1 xxx를 선택하십시오.

감사합니다, 인도네시아 Sentrapedagang.com


-5

이 특정 질문에 대해 선택된 답변은 정확하지만 URL에 여분의 "e"와 같은 중복 매개 변수가 있으면 오류나 예외가 발생하지 않고 함수가 자동으로 실패합니다.

a=2&b=2&c=5&d=4&e=1&e=2&e=3 

그래서 나는 내 자신의 파서를 사용하는 것을 선호한다.

//$_SERVER['QUERY_STRING'] = `a=2&b=2&c=5&d=4&e=100&e=200&e=300` 

$url_qry_str  = explode('&', $_SERVER['QUERY_STRING']);

//arrays that will hold the values from the url
$a_arr = $b_arr = $c_arr = $d_arr = $e_arr =  array();

foreach( $url_qry_str as $param )
    {
      $var =  explode('=', $param, 2);
      if($var[0]=="a")      $a_arr[]=$var[1];
      if($var[0]=="b")      $b_arr[]=$var[1];
      if($var[0]=="c")      $c_arr[]=$var[1];
      if($var[0]=="d")      $d_arr[]=$var[1];
      if($var[0]=="e")      $e_arr[]=$var[1];
    }

    var_dump($e_arr); 
    // will return :
    //array(3) { [0]=> string(1) "100" [1]=> string(1) "200" [2]=> string(1) "300" } 

이제 각 배열의 모든 매개 변수가 자체 배열에 있으므로 원하는 경우 언제든지 하나의 배열로 병합 할 수 있습니다.

희망이 도움이됩니다!


다른 값을 가진 동일한 쿼리 매개 변수 이름이 없어야합니다. 어쨌든 하나만 허용되므로 의미가 없습니다.
Cristian

3
@Cristian :“다른 값을 가진 동일한 쿼리 매개 변수 이름을 가져서는 안됩니다.” 맞습니다. 그러나 대답은 "... 오류나 예외가 발생하지 않고 함수가 자동으로 실패하는 URL"입니다. 응용 프로그램이 중단 될 수 있습니다. 이 답변은 좋지 않지만 문제를 강조합니다. 특히 누군가가 추가 매개 변수를 요청하여 임의로 요청하여 응용 프로그램이
중단
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.