Funkcja PHP do tworzenia ciągu zapytania z tablicy

165

Szukam nazwy funkcji PHP do zbudowania ciągu zapytania z tablicy par klucz-wartość. Zwróć uwagę, że szukam wbudowanej funkcji PHP, aby to zrobić, a nie homebrew (to wszystko wydaje się zwracać wyszukiwarka Google). Jest jeden, po prostu nie pamiętam jego nazwy ani nie mogę go znaleźć na php.net. IIRC jego nazwa nie jest tak intuicyjna.

Robin Barnes
źródło

Odpowiedzi:

312

Szukasz http_build_query().

TJ L
źródło
Jest to całkiem nowa funkcja, dostępna w PHP 5.
Calmarius,
15
Uważaj na tę funkcję! Pominie każdą parę klucz-wartość, w której wartość jest równa NULL. echo http_build_query(array("foo"=>"bar","bar"=>null))wyprodukuje tylkofoo=bar
cb0
@ cb0 działa podobnie do przesyłania formularzy w przeglądarce, puste pole wejściowe nie zostanie uwzględnione w przesłanym zapytaniu.
TJ L
1
@ceejayoz Cóż, znasz to już od dawna ... Twoje życzenie się spełniło?
Andrew
21

Oto prosta implementacja przyjazna dla 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
źródło
30
to jest wersja php4.
0x6A75616E
1
Podczas dekodowania PHP wydaje się również dekodować klucz w procentach. Może warto to zrobić tutaj?
Cloudfeet
@cloudfeet wydaje się rozsądne, aby to zrobić. Dzięki za wskazanie tego.
0x6A75616E
2

Jako dodatek do @thatjuanodpowiedzi.
Bardziej kompatybilna wersja PHP4 tego:

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
źródło
-2

Ponieważ to pytanie jest dość stare i dla PHP, oto sposób na zrobienie tego w (obecnie) bardzo popularnym frameworku PHP Laravel.

Aby zakodować ciąg zapytania dla ścieżki w aplikacji, podaj nazwy tras, a następnie użyj route()funkcji pomocniczej w następujący sposób:

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

Wynik będzie wyglądał mniej więcej tak:

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

Należy również pamiętać, że jeśli Twoja trasa ma np. Parametry segmentu ścieżki /documents/{id}, upewnij się, że przekazujesz również idargument do route()parametrów, w przeciwnym razie domyślnie użyje wartości pierwszego parametru.

alexkb
źródło
-3

Implode połączy tablicę w ciąg znaków, ale aby wykonać zapytanie SQL na podstawie pary kay / wartość, musisz napisać własną funkcję.

Kliknij opcję Głos za
źródło
Próbowałem, ale to nie zadziała. Próbuję zbudować ciąg zapytania http, który wymaga zarówno kluczy, jak i wartości z tablicy, implode nie może tego zrobić.
Robin Barnes
2
Rozumiem, nie byłem pewien, czy masz na myśli ciąg zapytania SQL, czy ciąg zapytania http.
Kliknij przycisk „Za głosowaniem”