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


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.