Função PHP para criar string de consulta a partir da matriz

165

Estou procurando o nome da função PHP para criar uma string de consulta a partir de uma matriz de pares de valores-chave. Observe que estou procurando a função PHP incorporada para fazer isso, não uma homebrew (isso é tudo que uma pesquisa no Google parece retornar). Há uma, simplesmente não consigo lembrar o nome ou encontrá-lo no php.net. O nome do IIRC não é tão intuitivo.

Robin Barnes
fonte

Respostas:

312

Você está procurando http_build_query().

TJ L
fonte
Este é um muito nova função, disponível a partir de PHP 5.
Calmarius
15
Tenha cuidado com esta função! Omitirá qualquer par de valores-chave em que o valor seja NULL. echo http_build_query(array("foo"=>"bar","bar"=>null))vai produzir apenasfoo=bar
CB0
@ cb0 funciona de maneira semelhante aos envios de formulários em um navegador, um campo de entrada vazio não será incluído na consulta enviada.
TJ L
1
@ceejayoz Bem, você já sabe disso há muito tempo ... Seu desejo se tornou realidade?
30516 Andrew Andrew
21

Aqui está uma implementação simples compatível com 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
fonte
30
esta é uma versão php4.
0x6A75616E
1
Ao decodificar, o PHP parece decodificar a chave também. Possivelmente vale a pena fazer isso aqui?
cloudfeet
@cloudfeet parece razoável fazê-lo. Obrigado por apontar isso.
0x6A75616E
2

Apenas como adição à @thatjuanresposta.
Versão PHP4 mais compatível disso:

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

Como essa pergunta é bastante antiga e, para o PHP, aqui está uma maneira de fazê-lo no (atualmente) muito popular framework PHP Laravel.

Para codificar a string de consulta para um caminho em seu aplicativo, forneça nomes às suas rotas e use a route()função auxiliar da seguinte maneira:

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

O resultado será semelhante a:

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

Lembre-se também de que, se sua rota tiver algum parâmetro de segmento de caminho, por exemplo /documents/{id}, certifique-se de passar um idargumento para os route()parâmetros também, caso contrário, será padrão usar o valor do primeiro parâmetro.

alexkb
fonte
-3

Implode combinará uma matriz em uma string para você, mas para fazer uma consulta SQL com um par kay / value, você precisará escrever sua própria função.

Click Voto a favor
fonte
Tentei isso, mas não vai funcionar. Estou tentando criar uma string de consulta http que requer as chaves e os valores da matriz, implode não pode fazer isso.
Robin Barnes
2
Entendo, não tinha certeza se você quis dizer uma string de consulta SQL ou uma string de consulta http.
Click Voto a favor