Función PHP para construir una cadena de consulta a partir de una matriz

165

Estoy buscando el nombre de la función PHP para construir una cadena de consulta a partir de una matriz de pares de valores clave. Tenga en cuenta que estoy buscando la función PHP integrada para hacer esto, no una homebrew (eso es todo lo que parece devolver una búsqueda de Google). Hay uno, simplemente no puedo recordar su nombre o encontrarlo en php.net. IIRC su nombre no es tan intuitivo.

Robin Barnes
fuente

Respuestas:

312

Usted está buscando http_build_query().

TJ L
fuente
Esta es una función bastante nueva, disponible desde PHP 5.
Calmarius
15
¡Ten cuidado con esta función! Omitirá cualquier par clave-valor donde el valor sea NULL. echo http_build_query(array("foo"=>"bar","bar"=>null))solo produciráfoo=bar
cb0
@ cb0 esto funciona de forma similar a los envíos de formularios en un navegador, no se incluirá un campo de entrada vacío en la consulta enviada.
TJ L
1
@ceejayoz Bueno, lo has sabido desde hace mucho tiempo ... ¿Tu deseo se ha hecho realidad?
Andrew
21

Aquí hay una implementación sencilla compatible con 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
fuente
30
Esta es una versión php4.
0x6A75616E
1
Al hacer su decodificación, PHP parece decodificar por ciento la clave también. ¿Posiblemente valga la pena hacer eso aquí?
cloudfeet
@cloudfeet parece razonable hacerlo. Gracias por mencionarlo.
0x6A75616E
2

Solo como complemento de @thatjuanla respuesta.
Versión PHP4 más compatible de esto:

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
fuente
-2

Como esta pregunta es bastante antigua y para PHP, aquí hay una forma de hacerlo en el marco PHP (actualmente) muy popular Laravel.

Para codificar la cadena de consulta para una ruta en su aplicación, proporcione los nombres de sus rutas y luego use la route()función auxiliar de la siguiente manera:

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

El resultado se verá más o menos así:

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

También tenga en cuenta que si su ruta tiene algún parámetro de segmento de ruta, por ejemplo /documents/{id}, asegúrese de pasar un idargumento a los route()parámetros también, de lo contrario, usará de manera predeterminada el valor del primer parámetro.

alexkb
fuente
-3

Implode combinará una matriz en una cadena para usted, pero para hacer una consulta SQL en un par kay / value tendrá que escribir su propia función.

Haga clic en Upvote
fuente
Intenté eso pero no funcionará. Estoy tratando de construir una cadena de consulta http que requiera tanto las claves como los valores de la matriz, implode no puede hacer esto.
Robin Barnes
2
Ya veo, no estaba seguro si se refería a una cadena de consulta SQL o una cadena de consulta http.
Haga clic en Upvote