PHP: Array in URL-Parameter String umwandeln (Format A=B&C=D)

PHP: Array in URL-Parameter String umwandeln (Format A=B&C=D)

Manchmal muss man eine Reihe von URL-Parametern übergeben, beispielsweise für eine API-Abfrage. Diesen String in PHP händisch zu erzeugen ist bereits keine schöne Aufgabe, zumal auch das Escaping der Werte – Beispielsweise title=Hallo+Welt statt title=Hallo Welt nicht vergessen werden darf. Besonders kniffelig wird es, wenn die Anzahl der Parameter vollkommen variabel ist. Denn schließlich wird die Einleitung des ersten Parameters mit einem Fragezeichen ? begonnen, alle weiteren trennt ein Und & Zeichen.

Doch wer einen tieferen Blick in die Dokumentation wirft wird feststellen, dass man sich darüber eigentlich gar keine Gedanken machen muss. Seit PHP 5 existiert nämlich die recht unbekannte Funktion http_build_query, die für genau diesen Anwendungsfall gedacht ist: Man übergibt ihr ein normales, assoziatives Array, und sie erstellt daraus den URL-Parameter String. Und zwar inklusive korrektem maskieren von Sonderzeichen wie Leerzeichen:

$urlParameters = array(
    'threadId' => 1234,
    'outputFormat' => 'json'
);
$urlQueryString = http_build_query($urlParameters);
$fullUrl = 'http://example.com/api?' . $urlQueryString;

Mit diesem Beispiel wird die URL http://example.com/api?threadId=1234&outputFormat=json erzeugt. Optional bietet die Funktion auch die Möglichkeit, das Trennzeichen der einzelnen URL-Parameter definieren zu können. Dies ist hilfreich, wenn man beispielsweise maskierte URLs erzeugen möchte, in denen das Und (&) Zeichen escaped wird. Dazu übergibt man das gewünschte Trennzeichen einfach als dritten Parameter:

$urlQueryString = http_build_query($urlParameters, '', '&');

Die Funktion ist sehr flexibel und kann beispielsweise auch für mehrdimensionale Arrays verwendet werden. Sogar aus selbstdefinierten Objekten wird ein valider Query-String anhand der öffentlichen Attribute erzeugt. Zu beachten ist jedoch, dass Null-Werte ignoriert werden. Übergibt man also beispielsweise das folgende Array

$urlParameters = array(
    'key1' => null
    'key2' => 1234
);

erhält man als Ausgabe nicht key1=&key2=1234 wie man es möglicherweise erwarten würde, sondern lediglich key2=1234.

Leave a Reply