Hàm PHP để xây dựng chuỗi truy vấn từ mảng


165

Tôi đang tìm tên của hàm PHP để xây dựng chuỗi truy vấn từ một mảng các cặp giá trị khóa. Xin lưu ý, tôi đang tìm kiếm hàm PHP tích hợp để thực hiện việc này, không phải là một homebrew (đó là tất cả một tìm kiếm google dường như trở lại). Có một cái, tôi không thể nhớ tên của nó hoặc tìm thấy nó trên php.net. IIRC tên của nó không phải là trực quan.

Câu trả lời:


312

Bạn đang tìm kiếm http_build_query().


Đây là một chức năng khá mới, có sẵn từ PHP 5.
Calmarius

15
Hãy cẩn thận với chức năng này! Nó sẽ bỏ qua bất kỳ cặp khóa-giá trị nào trong đó giá trị là NULL. echo http_build_query(array("foo"=>"bar","bar"=>null))sẽ chỉ sản xuấtfoo=bar
cb0

@ cb0 điều này hoạt động tương tự như gửi biểu mẫu trong trình duyệt, trường nhập liệu trống sẽ không được bao gồm trong truy vấn đã gửi.
TJ L

1
@ceejayoz Bạn đã biết nó từ lâu rồi ... Điều ước của bạn đã thành hiện thực?
Andrew

21

Đây là một cách thực hiện thân thiện với php4 đơn giản:

/**
* 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
đây là phiên bản php4.
0x6A75616E

1
Khi thực hiện giải mã, PHP cũng xuất hiện để giải mã phần trăm. Có thể đáng làm điều đó ở đây?
đám mây

@cloudfeet có vẻ hợp lý để làm như vậy. Cảm ơn đã chỉ ra điều đó.
0x6A75616E

2

Cũng như thêm vào @thatjuancâu trả lời.
Phiên bản PHP4 tương thích hơn của điều này:

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

Vì câu hỏi này khá cũ và đối với PHP, đây là một cách để làm điều đó trong khung công tác PHP (hiện tại) rất phổ biến.

Để mã hóa chuỗi truy vấn cho một đường dẫn trong ứng dụng của bạn, hãy đặt tên tuyến đường của bạn và sau đó sử dụng route()hàm trợ giúp như sau:

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

Kết quả sẽ trông giống như:

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

Ngoài ra, hãy lưu ý rằng nếu tuyến đường của bạn có bất kỳ tham số phân đoạn đường dẫn nào /documents/{id}, ví dụ , hãy đảm bảo bạn cũng chuyển một idđối số cho các route()tham số, nếu không nó sẽ mặc định sử dụng giá trị của tham số đầu tiên.


-3

Implode sẽ kết hợp một mảng thành một chuỗi cho bạn, nhưng để tạo một truy vấn SQL ra một cặp kay / value bạn sẽ phải viết hàm riêng của mình.


Đã thử nhưng nó sẽ không hoạt động. Tôi đang cố gắng xây dựng một chuỗi truy vấn http yêu cầu cả khóa và giá trị từ mảng, mã hóa không thể làm điều này.
Robin Barnes

2
Tôi thấy, không chắc chắn nếu bạn có nghĩa là một chuỗi truy vấn SQL hoặc chuỗi truy vấn http.
Nhấp vào Upvote
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.