79 votes

http_build_query() sans encodage d'url

Est-il possible d'utiliser http_build_query() sans que l'URL soit encodée selon une norme RFC ?

Pourquoi je ne veux pas tout encoder en URL : J'interroge l'API Ebay Ils insistent honnêtement sur le fait que les noms des paramètres ne sont pas encodés dans l'URL, jusqu'aux virgules entre parenthèses. Par exemple, DomainName(0) est un paramètre, et la requête échoue si ces parenthèses sont encodées.

3voto

mhgo Points 31

Vous pouvez utiliser urldecode() . Ou utilisez http_build_query avec l'option $arg_separator argument.

    $query_data= $data = array('bar', 'baz'=>'boom');
    $numeric_prefix= 'test_';
    $arg_separator = '&';
    $http_query = http_build_query ( $query_data, $numeric_prefix, $arg_separator );
    var_dump( $http_query );

le résultat de l'opération ci-dessus est le suivant

     string 'test_0=bar&baz=boom' (length=19)

préfixe numérique Si les indices du tableau sont des nombres, cette chaîne est ajoutée comme préfixe à chaque indice. Dans ce cas, la chaîne ' test_0=bar' .

arg_separator : est utilisé pour séparer les arguments. Si non est donné, php utilise la méthode arg_separator.output défini dans le php.ini

Voir php http_build_query

3voto

kiko carisse Points 368

J'essayais de créer une chaîne GET pour l'attacher à la fin d'une url comme ceci -

$get_params = array(
    'include' => array(
        'enrollments',
        'current_grading_period_scores'
    ),
    'enrollment_type' => array(
        'student',
    ),

);
$get_params = http_build_query($get_params);
$get_params = urldecode($get_params);
$url = $domain.$slug;
$url = $url.'?'.$get_params;
echo $url;

qui imprime

include[0]=enrollments&include[1]=current_grading_period_scores&enrollment_type[0]=student

Mais mon api n'aimait pas les chiffres entre crochets, j'ai donc trouvé une expression régulière qui supprime les chiffres -

preg_replace('/[[0-9]+]/', '[]', $get_params);

Le code final, et le résultat -

$get_params = array(
    'include' => array(
        'enrollments',
        'current_grading_period_scores'
    ),
    'enrollment_type' => array(
        'student',
    ),

);
$get_params = http_build_query($get_params);
$get_params = urldecode($get_params);
$get_params = preg_replace('/[[0-9]+]/', '[]', $get_params);
$url = $domain.$slug;
$url = $url.'?'.$get_params;
echo $url;

Imprime -

include[]=enrollments&include[]=current_grading_period_scores&enrollment_type[]=student

Si quelqu'un connaît une meilleure regex, qu'il me le fasse savoir, je suis un peu novice en la matière.

0voto

david Points 2128

Mon point de vue sur la réponse d'alex, mais plus rapide

$params = array('a' => 'A', 'b' => 'B');
$query = '';

foreach ($params as $param => $value) {
   $query .= $param.'='.$value .'&';
}

echo substr($query, 0, -1);

0voto

Jefkine Kafuna Points 69

Cela pourrait également fonctionner

$fields = array(
    'a' => 'A', 
    'b' => 'B'
 );

$separator = '';
foreach($fields as $key=>$value) {
    $fields_string .= $separator . $key . '=' . $value; 
    $separator = '&'; 
}

0voto

J'ai essayé de le faire récemment https://gist.github.com/marcocesarato/4293986fe93139f04d8269aa3fbd47e9 la différence est que cette fonction est récursive et compatible avec PHP4. Vous pouvez gérer ici l'urlencode

<?php
/**
 * Build URL query params
 * as http_build_query build a query url the difference is 
 * that this function is array recursive and compatible with PHP4
 *
 * @author Marco Cesarato <cesarato.developer@gmail.com>
 * @param $query
 * @param string $parent
 * @return string
 *
 * @example
 * $p = array('abbreviations' => array('google' => 'ggle', 'facebook' => array('abb_key' => 'fbook', 'fcbk')), 'key' => 'value');
 * echo url_build_query($p);
 */
function url_build_query($query, $parent = null){
    $query_array = array();
    foreach($query as $key => $value){
        $_key = empty($parent) ?  urlencode($key) : $parent . '[' . urlencode($key) . ']';
        if(is_array($value)) {
            $query_array[] = url_build_query($value, $_key);
        } else {
            $query_array[] = $_key . '=' . urlencode($value);
        }
    }
    return implode('&', $query_array);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X