Funzione PHP per creare una stringa di query dall'array


165

Sto cercando il nome della funzione PHP per creare una stringa di query da una matrice di coppie valore-chiave. Tieni presente che sto cercando la funzione PHP integrata per farlo, non una homebrew (è tutto ciò che una ricerca su Google sembra restituire). Ce n'è uno, non riesco proprio a ricordare il suo nome o trovarlo su php.net. IIRC il suo nome non è così intuitivo.

Risposte:


312

Stai cercando http_build_query().


Questa è una funzione abbastanza nuova, disponibile da PHP 5.
Calmarius

15
Fai attenzione con questa funzione! Ometterà qualsiasi coppia chiave-valore in cui il valore è NULL. echo http_build_query(array("foo"=>"bar","bar"=>null))produrrà solofoo=bar
cb0

@ cb0 funziona in modo simile agli invii di moduli in un browser, un campo di input vuoto non verrà incluso nella query inviata.
TJ L

1
@ceejayoz Beh, lo sai da molto tempo ormai ... Il tuo desiderio è diventato realtà?
Andrew,

21

Ecco una semplice implementazione di 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
questa è una versione php4.
0x6A75616E,

1
Durante la sua decodifica, PHP sembra decodificare anche la chiave. Forse vale la pena farlo qui?
cloudfeet

@cloudfeet sembra ragionevole farlo. Grazie per segnalarlo.
0x6A75616E

2

Proprio come aggiunta alla @thatjuanrisposta.
Versione PHP4 più compatibile di questo:

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

Poiché questa domanda è piuttosto vecchia e per PHP, ecco un modo per farlo nel (attualmente) molto popolare framework PHP Laravel.

Per codificare la stringa di query per un percorso nell'applicazione, assegnare i nomi dei percorsi e quindi utilizzare la route()funzione helper in questo modo:

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

Il risultato sarà simile a:

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

Inoltre, tieni presente che se il tuo percorso ha parametri del segmento di percorso, ad esempio /documents/{id}, assicurati di passare anche un idargomento ai route()parametri, altrimenti verrà utilizzato automaticamente il valore del primo parametro.


-3

Implode combinerà un array in una stringa per te, ma per rendere una query SQL una coppia kay / value dovrai scrivere la tua funzione.


Ci ho provato ma non funzionerà. Sto cercando di creare una stringa di query http che richieda sia le chiavi che i valori dell'array, l'impllode non può farlo.
Robin Barnes,

2
Vedo, non ero sicuro se intendevi una stringa di query SQL o una stringa di query http.
Fai clic su Aggiorna il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.