web-dev-qa-db-fra.com

PHP fonction pour construire une chaîne de requête à partir d'un tableau

Je cherche le nom de la fonction PHP pour créer une chaîne de requête à partir d'un tableau de paires clé-valeur. Veuillez noter que je recherche la fonction PHP intégrée pour le faire, et non un homebrew (c'est tout une recherche sur Google semble revenir). Il y en a un, je ne me souviens plus de son nom ni de le trouver sur php.net. IIRC son nom n'est pas si intuitif.

150
Robin Barnes

Vous recherchez http_build_query()

281
tj111

Voici une implémentation simple compatible avec 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 );

}
22
SuitedSloth

Juste comme ajout à la réponse de @thatjuan.
Version PHP4 plus compatible: 

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

Comme cette question est assez ancienne et pour PHP, voici une façon de le faire dans le framework (actuellement) très populaire PHP de Laravel.

Pour encoder la chaîne de requête d'un chemin dans votre application, donnez à vos routes des noms puis utilisez la fonction d'assistance route() like so:

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

Le résultat ressemblera à quelque chose comme:

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

Sachez également que si votre route a des paramètres de segment de chemin, par exemple. /documents/{id}, puis assurez-vous de passer également un argument id aux paramètres route(), sinon il utilisera par défaut la valeur du premier paramètre.

0
alexkb

Implode combinera un tableau en une chaîne pour vous, mais pour créer une requête SQL sur une paire kay/valeur, vous devrez écrire votre propre fonction.

0
Click Upvote

mais pour inverse ce travail, vous pouvez utiliser:

void parse_str(str $input, array $output);
//for example:
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

Bonne chance.

0
Armpc