Postleitzahl zu Stadt und umgekehrt in PHP

Ihr habt eine Postleitzahl (PLZ) und wollt den Namen der Stadt ermitteln oder umgekehrt? Das geht mit PLZ Online Tools oder eben mit einem eigenen PHP Skript.

In diesem Artikel zeige euch, wie Ihr ganz einfach mit PHP auf eine freie Postleitzahl-Datenbank für Deutschland zugreifen könnt.

Nachdem wir uns neulich damit beschäftigt haben, wie man eine Adresse anhand von GPS-Koordinaten mit PHP ermitteln kann, geht es jetzt also um die Postleitzahl.

Freie Postleitzahl Datenbank

Das OpenGeoDB Projekt stellt eine gemeinfreie Datenbank mit den Daten zu Postleitzahlen und Städten in Deutschland zur Verfügung.

Der Nachteil dieser Daten ist, dass es durchaus vorkommen kann, dass einige davon veraltet sind. Auf der anderen Seite könnt ihr die Datenbank kostenlos verwenden und in den letzten Jahren wird es vermutlich auch nicht so viele Änderungen in der Postleitzahl-Zuteilung gegeben haben.

Genau so sind auch Fehler meinerseits bei der Daten-Umwandlung nicht ausgeschlossen.

Hinweis: Wenn euch die Richtigkeit der Daten sehr wichtig ist, sollten ihr daher überlegen, auf eine eigene Lösung zu setzen.

Die reinen Datensätze von 2012 könnt ihr auf dieser Seite herunterladen. Damit könnt ihr nun erstmal noch nicht so viel anfangen in PHP.

OpenGeoDB bietet selbst eine PHP-Klasse mit Beispielsfunktionen an. Diese hat nicht auf meine Bedürfnisse gepasst, zum Beispiel weil sie die Geo-Daten in einer MySQL-Tabelle voraussetzt. Ich habe mich daher für eine andere Lösung entschieden, die ich euch in diesem Artikel vorstellen werde.

PLZ in Stadt umwandeln mit PHP

Zum einen habe ich die Daten in das Array $plzToCity umgewandelt. Das Array enthält als Index die PLZ und als Wert einen Array mit dem Ortsnamen, Längen- und Breitengrad.

Download Button
Download: plzToCity.php

Die Datei plzToCity.php mit knapp über 200 KB könnt ihr hier herunterladen.

Anschließend könnt ihr die Datei einfach auf euren Webserver übertragen und dann wie folgt verwenden:

// Datei-Pfad ggf. anpassen //
include_once "plzToCity.php";

// Daten zu PLZ abfragen & Ergebnis ausgeben (ab PHP 7) //
var_dump(($plzToCity['01189'] ?? 'Nicht gefunden'));

// Daten zu PLZ abfragen & Ergebnis ausgeben (auch ältere PHP-Versionen, mit normaler if-Abfrage) //
if (isset($plzToCity['01189'])) {
	var_dump($plzToCity['01189']);
} else {
	echo 'Nicht gefunden';
}

Das Skript enthält eine Version, für PHP 7.0 und neuer. Alternativ könnt ihr den Code darunter verwenden, der womöglich auch etwas verständlicher ist.

Wenn die PLZ gefunden werden kann, könnte die Ausgabe so aussehen:

array(3) {
  [0]=>
  string(7) "Dresden"
  [1]=>
  float(51.013916128923)
  [2]=>
  float(13.704510569169)
}

Sonst wird ein „Nicht gefunden“ ausgegeben.

Stadt in eine PLZ umwandeln mit PHP

Das ganze geht auch andersherum. Wenn die Datenbank-Datei nicht 2 Mal Speicherplatz verbrauchen soll, könnt ihr natürlich eine Lösung mit array_search() basteln, die das Array nach den Städtenamen durchsucht.

Alternativ habe ich für diesen Anwendungsfall auch ein PHP-Array erstellt, das die Daten praktisch sortiert enthält.

Vergesst nicht: Viele Städten sind mehrere Postleitzahlen auf einmal zugeordnet.

Download Button
Download: cityToPlz.php

Die Datei CityToPlz.php mit gut 200 KB könnt ihr hier herunterladen und dann in eure PHP Skripte einbinden.

Auch hier gibt es wieder ein Beispiel zur Datenabfrage. Wir fragen die Postleitzahlen ab, die der Stadt Konstanz zugeordnet sind.

// Datei-Pfad ggf. anpassen //
include_once "cityToPlz.php";

// Daten zur Stadt abfragen & Ergebnis ausgeben (ab PHP 7) //
var_dump(($cityToPlz['Konstanz'] ?? 'Nicht gefunden'));

// Daten zur Stadt abfragen & Ergebnis ausgeben (auch ältere PHP-Versionen, mit normaler if-Abfrage) //
if (isset($cityToPlz['Konstanz'])) {
	var_dump($cityToPlz['Konstanz']);
} else {
	echo 'Nicht gefunden';
}

Im Erfolgsfall wird uns ein Array mit Postleitzahlen und Koordinaten zurückgegeben, in unserem Beispielsfall also:

array(4) {
	[0]=> array(3) {
		[0]=> string(5) "78462"
		[1]=> string(15) "47.664917072115"
		[2]=> string(15) "9.1731452746988"
	}
	[1]=> array(3) {
		[0]=> string(5) "78464"
		[1]=> string(15) "47.679663210994"
		[2]=> string(15) "9.1981680212083"
	}
	[2]=> array(3) {
		[0]=> string(5) "78465"
		[1]=> string(14) "47.72726302168"
		[2]=> string(15) "9.1442547487328"
	}
	[3]=> array(3) {
		[0]=> string(5) "78467"
		[1]=> string(15) "47.686925320199"
		[2]=> string(15) "9.1482131302628"
	}
}

Wenn kein zugehöriger Eintrag gefunden werden konnte, wird „Nicht gefunden“ ausgegeben.

Fazit

Dank offener Datenbanken ist es gar nicht so schwer mit den Daten und einem kleinen PHP-Skript Postleitzahlen und Städte einander zuzuordnen und z.B. die Postleitzahl für eine Stadt abzufragen.