Franz. Z.: Autocomplete Problem

Hi,

ich hab mir ein Ajax-Autocomplte Script herunter geladen. Funktioniert auch sehr gut, einziger Schönheitsfehler ist, dass es alle Elemente der Ergebnismenge nur vom ersten bis zum n-ten Buchstaben mit der Eingabe vergleicht.

Dafür zuständig ist folgender Teil:

  
	if ($len)  
	{  
		for ($i=0;$i<count($aUsers);$i++)  
		{  
			// had to use utf_decode, here  
			// not necessary if the results are coming from mysql  
			//  
			if (strtolower(substr(utf8_decode($aUsers[$i]),0,$len)) == $input)  
				$aResults[] = array( "id"=>($i+1) ,"value"=>htmlspecialchars($aUsers[$i]), "info"=>htmlspecialchars($aInfo[$i]) );  
			  
			//if (stripos(utf8_decode($aUsers[$i]), $input) !== false)  
			//	$aResults[] = array( "id"=>($i+1) ,"value"=>htmlspecialchars($aUsers[$i]), "info"=>htmlspecialchars($aInfo[$i]) );  
		}  
	}  
  

Wie kann ich den ändern, damit es egal ist, an welcher Stelle die eigegebene Buchstabenkombination mit der Ergebnissmenge übereinstimmen darf und es dann dennoch angezeigt wird?

Gruß, Franz

  1. Hallo Franz,

    Wenn ich das richtig sehe ist die Stelle um substr der relevante Part.

    Gruß
    Ole
    (8-)>

    --
    Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
    1. Hallo Franz,

      Wenn ich das richtig sehe ist die Stelle um substr der relevante Part.

      Hi Ole,

      das siehst Du richtig. Aber substr kann man ja nicht ohne Anfangswert benutzen, oder?

      Grüße, Franz

      1. Hallo Franz,

        das siehst Du richtig. Aber substr kann man ja nicht ohne Anfangswert benutzen, oder?

        Ich kenn mich mit PHP zwar nicht so aus, aber die Doku liest sich zumindest so. Um vom Anfangswert unabhängig zu sein sieht preg_match vielversprechend aus.

        Gruß
        Ole
        (8-)>

        --
        Das Wort Vegetarier kommt aus dem Indianischen und bedeutet: Zu dumm zum Jagen.
        1. Ich kenn mich mit PHP zwar nicht so aus, aber die Doku liest sich zumindest so. Um vom Anfangswert unabhängig zu sein sieht preg_match vielversprechend aus.

          Hi Ole,

          aber preg_match braucht sicher viel mehr Ressourchen als z.B. strpos.
          Kann ich aber nicht belegen, ist nur ne Einschätzung.

          Deshalb frag ich ja nach, welche der Optionen möglichst effizient arbeitet.

          Grüße, Franz

          1. »» Ich kenn mich mit PHP zwar nicht so aus, aber die Doku liest sich zumindest so. Um vom Anfangswert unabhängig zu sein sieht preg_match vielversprechend aus.
            »»

            Hi Ole,

            aber preg_match braucht sicher viel mehr Ressourchen als z.B. strpos.
            Kann ich aber nicht belegen, ist nur ne Einschätzung.

            Deshalb frag ich ja nach, welche der Optionen möglichst effizient arbeitet.

            Grüße, Franz

            [Link:http://phpperformance.de/pruefen-ob-ein-string-eine-bestimmte-zeichenkette-enthaelt/]

            1. Original: (funktioniert)

                
              		for ($i=0;$i<count($aUsers);$i++)  
              		{  
              			// had to use utf_decode, here  
              			// not necessary if the results are coming from mysql  
              			//  
              			if (strtolower(substr(utf8_decode($aUsers[$i]),0,$len)) == $input)  
              				$aResults[] = array( "id"=>($i+1) ,"value"=>htmlspecialchars($aUsers[$i]), "info"=>htmlspecialchars($aInfo[$i]) );  
              			  
              			//if (stripos(utf8_decode($aUsers[$i]), $input) !== false)  
              			//	$aResults[] = array( "id"=>($i+1) ,"value"=>htmlspecialchars($aUsers[$i]), "info"=>htmlspecialchars($aInfo[$i]) );  
              		}  
              	}  
              
              

              "Fälschung": (funktioniert leider nicht)

                
              		for ($i=0;$i<count($aUsers);$i++)  
              		{  
              			// had to use utf_decode, here  
              			// not necessary if the results are coming from mysql  
              			//  
              $aUsers[$i]=utf8_decode($aUsers[$i]);  
              $aUsers[$i]=strtolower($aUsers[$i]);  
                
              			if (strpos($aUsers[$i],$input) !==false) {  
              				$aResults[] = array( "id"=>($i+1) ,"value"=>htmlspecialchars($aUsers[$i]), "info"=>htmlspecialchars($aInfo[$i]) );  
              		}  
              	}  
                
              
              
              1. "Fälschung": (funktioniert leider nicht)

                Tut sie, wenn allle geschweiften Klammern stimmig sind ;-)

                1. 			if (strtolower(strpos(utf8_decode($aUsers[$i]),$input)) !== false) {  
                  				$aResults[] = array( "id"=>($i+1) ,"value"=>htmlspecialchars($aUsers[$i]), "info"=>htmlspecialchars($aInfo[$i]) );  
                  			}  
                    
                    
                    
                    
                  		if (strtolower(substr(utf8_decode($aUsers[$i]),0,$len)) == $input)  
                                                  $aResults[] = array( "id"=>($i+1) ,"value"=>htmlspecialchars($aUsers[$i]), "info"=>htmlspecialchars($aInfo[$i]) );  
                    
                  
                  

                  Warum ergibt die untere Abfrage ein stimmiges Ergebnis und die obere wirft mir praktisch alle db-Einträge aus, egal ob sie passen oder nicht??

                  1. Moin!

                    Warum ergibt die untere Abfrage ein stimmiges Ergebnis und die obere wirft mir praktisch alle db-Einträge aus, egal ob sie passen oder nicht??

                    Weil strtolower() nun mal Strings zurückgibt, keine typechten Booleans:

                    Wenn du deinen Code mal drastisch kürzt:

                    if (strtolower(...) !== false) {
                    if (strtolower(...) == $input) {

                      
                      
                     - Sven Rautenberg
                    
                    1. Wenn du deinen Code mal drastisch kürzt:
                      »» [code lang=php]
                      »» if (strtolower(...) !== false) {
                      »» if (strtolower(...) == $input) {

                      Jups. Dann seh ichs auch :-)
                      Danke an Dich!
                      Franz

  2. Wie kann ich den ändern, damit es egal ist, an welcher Stelle die eigegebene Buchstabenkombination mit der Ergebnissmenge übereinstimmen darf und es dann dennoch angezeigt wird?

    Gruß, Franz

    Ich meine natürlich, welche der vorhandenen Möglichkeiten, zu überprüfen, ob der Teilstring im String vorhande ist, geht am schnellsten bzw. kostet die wenigsten Ressourcen??

    Hatte mich da etwas missverständlich ausgedrückt, sorry.

    Grüße