PHP-Funktion zum Erstellen einer Abfragezeichenfolge aus einem Array

164

Ich suche nach dem Namen der PHP-Funktion, um eine Abfragezeichenfolge aus einem Array von Schlüsselwertpaaren zu erstellen. Bitte beachten Sie, dass ich nach der integrierten PHP- Funktion suche , um dies zu tun, nicht nach einer Homebrew-Funktion (das ist alles, was eine Google-Suche zurückzugeben scheint). Es gibt einen, ich kann mich einfach nicht an seinen Namen erinnern oder ihn auf php.net finden. IIRC sein Name ist nicht so intuitiv.

Robin Barnes
quelle

Antworten:

311

Du suchst http_build_query().

TJ L.
quelle
Dies ist eine ziemlich neue Funktion, verfügbar von PHP 5.
Calmarius
15
Seien Sie vorsichtig mit dieser Funktion! Jedes Schlüssel-Wert-Paar, bei dem der Wert NULL ist, wird weggelassen. echo http_build_query(array("foo"=>"bar","bar"=>null))wird nur produzierenfoo=bar
cb0
@ cb0 Dies funktioniert ähnlich wie das Senden von Formularen in einem Browser. Ein leeres Eingabefeld wird nicht in die übermittelte Abfrage aufgenommen.
TJ L
1
@ceejayoz Nun, du weißt es schon lange ... Dein Wunsch ist in Erfüllung gegangen?
Andrew
22

Hier ist eine einfache php4-freundliche Implementierung:

/**
* 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
quelle
30
Dies ist eine PHP4-Version.
0x6A75616E
1
Bei der Dekodierung scheint PHP auch den Schlüssel in Prozent zu dekodieren. Möglicherweise lohnt es sich, das hier zu tun?
Wolkenfüße
@cloudfeet scheint dies vernünftig zu tun. Vielen Dank für den Hinweis.
0x6A75616E
3

Nur als Ergänzung zu @thatjuan's Antwort.
Kompatiblere PHP4-Version davon:

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
quelle
-1

Da diese Frage ziemlich alt und für PHP ist, gibt es hier eine Möglichkeit, dies im (derzeit) sehr beliebten PHP-Framework Laravel zu tun.

Um die Abfragezeichenfolge für einen Pfad in Ihrer Anwendung zu codieren, geben Sie Ihre Routennamen ein und verwenden Sie dann die route()Hilfsfunktion wie folgt :

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

Das Ergebnis sieht ungefähr so ​​aus:

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

Beachten Sie auch, dass Sie, wenn Ihre Route Pfadsegmentparameter enthält, z. B. auch /documents/{id}ein idArgument an die route()Parameter übergeben, da sonst standardmäßig der Wert des ersten Parameters verwendet wird.

alexkb
quelle
-2

Implode kombiniert ein Array zu einer Zeichenfolge für Sie, aber um eine SQL-Abfrage zu einem Kay / Wert-Paar zu machen, müssen Sie Ihre eigene Funktion schreiben.

Klicken Sie auf Upvote
quelle
Versuchte das, aber es wird nicht funktionieren. Ich versuche, eine http-Abfragezeichenfolge zu erstellen, die sowohl die Schlüssel als auch die Werte aus dem Array erfordert. Implode kann dies nicht.
Robin Barnes
2
Ich verstehe, war mir nicht sicher, ob Sie eine SQL-Abfragezeichenfolge oder eine http-Abfragezeichenfolge gemeint haben.
Klicken Sie auf Upvote