PHP berfungsi untuk membangun string kueri dari array

165

Saya mencari nama fungsi PHP untuk membangun string kueri dari array pasangan nilai kunci. Harap dicatat, saya mencari fungsi PHP built-in untuk melakukan ini, bukan yang homebrew (itu saja yang tampaknya pencarian google kembali). Ada satu, saya tidak bisa mengingat namanya atau menemukannya di php.net. IIRC namanya tidak begitu intuitif.

Robin Barnes
sumber

Jawaban:

312

Anda sedang mencari http_build_query().

TJ L
sumber
Ini adalah fungsi yang cukup baru, tersedia dari PHP 5.
Calmarius
15
Hati-hati dengan fungsi ini! Ini akan menghilangkan pasangan nilai kunci mana pun yang nilainya NULL. echo http_build_query(array("foo"=>"bar","bar"=>null))hanya akan menghasilkanfoo=bar
cb0
@ cb0 ini berfungsi seperti mengirimkan formulir di browser, bidang input kosong tidak akan disertakan dalam permintaan yang dikirimkan.
TJ L
1
@ceejayoz Ya sudah lama kamu kenal sekarang ... Keinginanmu telah terwujud?
Andrew
21

Berikut ini adalah implementasi sederhana ramah-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 );

}
0x6A75616E
sumber
30
ini adalah versi php4.
0x6A75616E
1
Saat melakukan decoding, PHP juga muncul untuk meng-decode kunci. Mungkin layak dilakukan di sini?
cloudfeet
@cloudfeet tampaknya masuk akal untuk melakukannya. Terima kasih telah menunjukkannya.
0x6A75616E
2

Sama seperti tambahan @thatjuanjawaban.
Versi PHP4 yang lebih kompatibel untuk ini:

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);
    }
}
vp_arth
sumber
-2

Karena pertanyaan ini cukup lama dan untuk PHP, berikut adalah cara untuk melakukannya dalam kerangka PHP Laravel yang sangat populer.

Untuk menyandikan string kueri untuk jalur di aplikasi Anda, berikan nama rute Anda dan kemudian gunakan route()fungsi pembantu seperti:

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

Hasilnya akan terlihat seperti:

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

Perlu diketahui juga bahwa jika rute Anda memiliki parameter segmen jalan misalnya /documents/{id}, maka pastikan Anda meneruskan idargumen ke route()parameter juga, jika tidak maka akan menggunakan nilai parameter pertama secara default.

alexkb
sumber
-3

Implode akan menggabungkan array menjadi string untuk Anda, tetapi untuk membuat query SQL dari pasangan kay / nilai Anda harus menulis fungsi Anda sendiri.

Klik Upvote
sumber
Sudah mencoba itu tetapi tidak akan berhasil. Saya mencoba membuat string kueri http yang memerlukan kunci dan nilai dari array, implode tidak bisa melakukan ini.
Robin Barnes
2
Saya mengerti, tidak yakin apakah yang Anda maksud adalah string kueri SQL atau string kueri http.
Klik Upvote