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.