배열에서 쿼리 문자열을 작성하는 PHP 함수


165

키 값 쌍의 배열에서 쿼리 문자열을 작성하는 PHP 함수의 이름을 찾고 있습니다. 이 작업을 수행 하기 위해 내장 PHP 기능을 찾고 있습니다 . 홈 브룩 기능이 아닙니다 (Google 검색이 모두 반환되는 것 같습니다). 하나만 있습니다. 이름을 기억하지 못하거나 php.net에서 찾을 수 없습니다. IIRC의 이름은 그렇게 직관적이지 않습니다.

답변:


312

찾고 있습니다 http_build_query().


이것은 PHP 5에서 사용할 수있는 새로운 기능입니다.
Calmarius

15
이 기능에주의하십시오! 값이 NULL 인 키-값 쌍을 생략합니다. echo http_build_query(array("foo"=>"bar","bar"=>null))생산 만foo=bar
cb0

@ cb0 이것은 브라우저에서 양식 제출과 유사하게 작동하며 빈 입력 필드는 제출 된 쿼리에 포함되지 않습니다.
TJ L

1
@ceejayoz 글쎄, 당신은 지금 오랫동안 그것을 알고있다 ... 당신의 소원이 이루어졌다?
Andrew

21

다음은 간단한 php4 친화적 인 구현입니다.

/**
* Builds an http query string.
* @param array $query  // of key value pairs to be used in the query
* @return string       // http query string.
**/
function build_http_query( $query ){

    $query_array = array();

    foreach( $query as $key => $key_value ){

        $query_array[] = urlencode( $key ) . '=' . urlencode( $key_value );

    }

    return implode( '&', $query_array );

}

30
이것은 php4 버전입니다.
0x6A75616E

1
디코딩을 할 때, PHP는 키를 퍼센트 디코딩하는 것처럼 보입니다. 여기서 그럴 가치가 있습니까?
cloudfeet

@cloudfeet는 그렇게하는 것이 합리적입니다. 지적 해 주셔서 감사합니다.
0x6A75616E

2

@thatjuan의 답변 외에도 .
더 호환되는 PHP4 버전 :

if (!function_exists('http_build_query')) {
    if (!defined('PHP_QUERY_RFC1738')) {
        define('PHP_QUERY_RFC1738', 1);
    }
    if (!defined('PHP_QUERY_RFC3986')) {
        define('PHP_QUERY_RFC3986', 2);
    }
    function http_build_query($query_data, $numeric_prefix = '', $arg_separator = '&', $enc_type = PHP_QUERY_RFC1738)
    {
        $data = array();
        foreach ($query_data as $key => $value) {
            if (is_numeric($key)) {
                $key = $numeric_prefix . $key;
            }
            if (is_scalar($value)) {
                $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($key) : rawurlencode($key);
                $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($value) : rawurlencode($value);
                $data[] = "$k=$v";
            } else {
                foreach ($value as $sub_k => $val) {
                    $k = "$key[$sub_k]";
                    $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($k) : rawurlencode($k);
                    $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($val) : rawurlencode($val);
                    $data[] = "$k=$v";
                }
            }
        }
        return implode($arg_separator, $data);
    }
}

-2

이 질문은 꽤 오래되었고 PHP의 경우 (현재) 매우 인기있는 PHP 프레임 워크 Laravel에서이를 수행하는 방법이 있습니다.

응용 프로그램에서 경로의 쿼리 문자열을 인코딩하려면 경로 이름 을 지정한 다음 route()도우미 함수를 다음과 같이 사용하십시오 .

route('documents.list.', ['foo' => 'bar']);

결과는 다음과 같습니다.

http://localhost/documents/list?foo=bar

또한 경로에 경로 세그먼트 매개 변수가있는 경우 매개 변수에도 인수를 /documents/{id}전달해야합니다 . 그렇지 않으면 기본적으로 첫 번째 매개 변수의 값을 사용합니다.idroute()


-3

Implode 는 배열을 문자열로 결합하지만 SQL 쿼리를 kay / value 쌍으로 만들려면 자체 함수를 작성해야합니다.


그것을 시도했지만 작동하지 않습니다. 키와 배열의 값이 모두 필요한 http 쿼리 문자열을 만들려고하는데 implode는이 작업을 수행 할 수 없습니다.
Robin Barnes

2
SQL 쿼리 문자열 또는 http 쿼리 문자열을 의미하는지 확실하지 않았습니다.
Click Upvote
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.