Array durchsuchen und alle Werte ausgeben

JesusFreak777

Erfahrenes Mitglied
Hallo,

ich habe mir ein array erstellt in dem einige Namen stehen:
Code:
array(
   [0] = Anna,
   [1] = anton,
   [2] = Bernd,
   [3] = Bernhard,
   [4] = ...
)

Jetzt suche ich nach einer art Autovervollständigung...
- ich möchte nur nach dem Anfang suchen -> d.h. wenn ich "nn" eingebe soll er mir nichts zurückgeben (auch wenn in Anna "nn" vorhanden ist)
- Die suche soll nicht Casesensitiv ein -> "An" soll mir dann ein Array mit Anna & Anton zurückgeben...

PHP:
function such($array, $name) {
   $rueck = array(); //neues Array
   foreach($array as $value) {
      if(---WAS BRAUCH ICH DA---){ //filtern nach anfängen (nicht CASESENSITIV!!!)
         $rueck[] = $value; //da soll dann einfach nur der Name in das neue Array :)
      }
   }
   return $rueck; //neues Array zurückschicken
}

leider steh ich grad auf dem Schlauch und weiß nicht, was ich Google fragen soll...
Danke, wenn mir jemand nen brauchbaren Tipp gibt ;)

Beste Grüße
 
Kaum stellt man die Frage, hat man nen Geistesblitz :D

... hat jemand ne bessere Idee?

PHP:
function search($array, $name) {
    $rueck = array(); 
    foreach($array as $value) {
        if(substr(strtolower($value), 0, strlen($name)) == strtolower($name)) {
            $rueck[] = $value; 
        }
    }
    return $rueck; 
}
 
Hier ein paar Vorschläge:

  • Du rufst strtolower() in jedem Schleifenaufruf auf! Verschiebe diesen Aufruf vor die Schleife.
  • Du berechnest die Länge des Suchwortes auch jedes Mal innerhalb der Schleife!
  • Ist dein Array alphabetisch sortiert? Wenn ja, könnte man abbrechen, sobald der ersten Buchstabe bzw. die ersten n Buchstaben des Suchwortes alphabetisch kleiner sind als den ersten bzw. die ersten n Buchstaben des aktuellen Arraywertes innerhalb der Schleife. Ob dies wirklich beträchtliche Zeit einspart ist die Frage. Auf jeden Fall würde ich in der Dokumentation der Funktion search() das Laufzeitverhalten angeben, bei deinem aktuellen Code lässt sich bspw. aussagen, dass dieser Element von Omega(n) ist, also das Laufzeitverhalten mindestens linear zu der Arraygröße wächst.
  • Wenn du es stilistisch schöner haben willst:
PHP:
function searchBeginsWith($array, $needle) {
	$len = strlen($needle);
	$needle = strtolower($needle);
	return array_filter(function ($val) {
		if (substr($val, 0, $len) === $needle) {
			return true;
		}
		return false;
	}
}
 
array_filter und stripos kombiniert ergibt etwa das was du suchst.
http://ideone.com/B0bRJM

PHP:
function search($array, $name){
   return array_filter(
     $array ,
     create_function(
       '$var',
       "return (stripos(\$var, '{$name}') === 0);"
     )
   );
}
 
Zurück