5 Stellige Zahlen vergleichen

Ensaw

Mitglied
Hallo,

ich plage mich seit geraumer Zeit mit einem Problem. Und zwar habe ich einen Filter geschrieben, der Postleitzahlen vergleicht und diese ausgibt.

Nun ist es so, dass wenn ich in das Suchfeld "50000" eingebe, alle von 50000 und aufwärts ausgegeben werden.
Ich möchte dies dennoch so einschränken, dass wenn ich nur "5" eingebe, alle mit dem Anfang "5" und höher ausgegeben werden. Dies soll auch geschehen wenn ich "50" oder ähnliches eingebe.

Ich arbeite mit einem Array und mit dem Code vergleiche ich die Postleitzahlen:
PHP:
			if ($this->_plzvon != "")
			{
				$inListeHinzufuegen = $inListeHinzufuegen && ($this->_plzvon<=$kunde->postleitzahl);
			}
		
			if ($this->_plzbis != "")
			{
				$inListeHinzufuegen = $inListeHinzufuegen && ($kunde->postleitzahl<=$this->_plzbis);
			}
 
Dann prüfe wie lang die Zahl ist die eingegeben wurde und fülle das was fehlt mit Nullen auf.

PHP:
<?php
$zahl = 5;
echo str_pad($zahl, 5, "0") ."<br />";

$zahl = 50;
echo str_pad($zahl, 5, "0") ."<br />";

$zahl = 500;
echo str_pad($zahl, 5, "0") ."<br />";
?>

Es wird immer die Zahl 50000 ausgegeben.
 
Das obige Beispiel soll dir ja nur zeigen wie du eine Zahl immer auf volle 5 Stellen "auffüllen" kannst.

Wie du das vergleichen kannst, kann ich dir so nicht sagen da ich nicht weiß woher die Postleitzahlen kommen. Werden die aus einer Datenbank abgefragt oder stehen die in dem Array von dem du gesprochen hast?
 
Ich weiß ja nicht ob es hier jetzt um alle Postleitzahlen von Deutschland geht. Aber wenn du die alle in ein Array einlesen willst könntest du Probleme bekommen!

Davon mal abgesehen:

PHP:
<?php
function filter($wert) {
global $gesucht;

    if ($wert >= str_pad($gesucht, 5, "0") && $wert <= str_pad($gesucht, 5, "9")) return $wert;
}

$plz = array
			(10000, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008, 10009, 10010,
			20000, 20001, 20002, 20003, 20004, 20005, 20006, 20007, 20008, 20009, 20010);

$gesucht = 100;

$treffer = array_filter($plz, "filter");

var_dump($treffer);
?>

Mit array_filter kannst du das Array auf bestimmte Werte bzw. einen Wertebereich filtern. Das in Verbindung mit dem ersten Beispiel sollte dir zur Lösung verhelfen!
 
Zuletzt bearbeitet:
Wobei Postleitzahlen auch mit 0 beginnen können.

Hier eine Variante ohne global:

PHP:
<?php

function filter(array $plzs, $searchString)
{
    return array_filter($plzs, function ($wert) use ($searchString) {
        return 0 === strpos($wert, $searchString);
    });
}

$plzs = array(
    '01234',
    '10000', '10001', '10002', '10003', '10004', '10005', '10006', '10007', '10008', '10009', '10010', '11099',
    '20000', '20001', '20002', '20003', '20004', '20005', '20006', '20007', '20008', '21009', '21010'
);

var_dump(
    filter($plzs, '100'),
    filter($plzs, '21'),
    filter($plzs, '0'),
    filter($plzs, '00'),
    filter($plzs, '100000')
);

Code:
array(11) {
  [1] =>
  string(5) "10000"
  [2] =>
  string(5) "10001"
  [3] =>
  string(5) "10002"
  [4] =>
  string(5) "10003"
  [5] =>
  string(5) "10004"
  [6] =>
  string(5) "10005"
  [7] =>
  string(5) "10006"
  [8] =>
  string(5) "10007"
  [9] =>
  string(5) "10008"
  [10] =>
  string(5) "10009"
  [11] =>
  string(5) "10010"
}
array(2) {
  [22] =>
  string(5) "21009"
  [23] =>
  string(5) "21010"
}
array(1) {
  [0] =>
  string(5) "01234"
}
array(0) {
}
array(0) {
}
 
PHP:
		$a = array();
		foreach ($this->_daten->gibDaten() as $kunde)
		{
			
			$zahl1 = strlen($this->_plzvon);
			$zahl2 = strlen($this->_plzbis);
			
			if ($zahl1 == "")
			{
				$zahl = 1;
			}
			
			if ($zahl2 == "")
			{
				$zahl2 = 1;
			}
			
			$plz1 = substr($kunde->postleitzahl, 0,$zahl1);
			$plz2 = substr($kunde->postleitzahl, 0,$zahl2);
			
			if ($this->_vorname == "" || $kunde->vorname == $this->_vorname)
			{
				if ($kunde->postleitzahl > $this->_plzvon == true && $this->_plzbis == ""|| $kunde->postleitzahl < $this->_plzbis == true && $this->_plzvon == "" || $this->_plzvon > $plz1 == false && $this->_plzbis == "" || $this->_plzbis < $plz2 == false && $this->_plzvon == "")
				{
					$a[] = $kunde;
				}
				else if ($kunde->postleitzahl > $this->_plzvon && $kunde->postleitzahl < $this->_plzbis || $this->_plzvon > $plz1 == false && $this->_plzbis < $plz2 == false)
				{
					$a[] = $kunde;
				}
				
			} 
		}

Habs, danke.
 
Boah. Mag sein, dass das klappt, aber ich finde es völlig unlesbar. :)

Da würde ich vielleicht noch mal ein wenig „optimieren“.
 
Zurück