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.

Antworten:


311

Du suchst http_build_query().


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 );

}

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

-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.


-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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.