ฟังก์ชั่น PHP เพื่อสร้างสตริงแบบสอบถามจากอาร์เรย์


165

ฉันกำลังมองหาชื่อของฟังก์ชั่น PHP เพื่อสร้างสตริงแบบสอบถามจากอาร์เรย์ของคู่ของค่าคีย์ โปรดทราบว่าฉันกำลังมองหาฟังก์ชั่นPHP ในตัวเพื่อทำสิ่งนี้ไม่ใช่ homebrew (นั่นคือการค้นหาโดย 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 คุณรู้จักกันมานานแล้วตอนนี้ ... ความปรารถนาของคุณเป็นจริงไหม?
แอนดรู

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}ให้ตรวจสอบให้แน่ใจว่าคุณส่งidอาร์กิวเมนต์ไปยังroute()พารามิเตอร์ด้วยมิฉะนั้นจะเป็นค่าเริ่มต้นที่จะใช้ค่าของพารามิเตอร์แรก


-3

Implodeจะรวมอาเรย์เข้ากับสตริงสำหรับคุณ แต่เพื่อให้เคียวรี SQL ใช้คู่ kay / value คุณจะต้องเขียนฟังก์ชันของคุณเอง


พยายาม แต่ไม่ได้ผล ฉันกำลังพยายามสร้างสตริงการสืบค้น http ซึ่งต้องการทั้งคีย์และค่าจากอาร์เรย์ซึ่ง implode ไม่สามารถทำได้
Robin Barnes

2
ฉันเห็นไม่แน่ใจว่าคุณหมายถึงสตริงการสืบค้น SQL หรือสตริงการสืบค้น http
คลิกโหวต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.