php funnktion geht net

S

Schneemann

Routinier
hab hier n funktion, die mir zählen soll wie oft $needle in $haystack vorkommt. dafür gibt es substr_count. Aber ich will dass er zwischen groß-und-klein-schreibung keinen unterschied macht (deswegen str_i_pos).

Aber irgendwie blick ich grade nicht wo der fehler ist. Irgendwie gibt stripos() immer FALSE zurück.

PHP:
function str_count($haystack,$needle) {
  $offset = 0;
  $i = 0;
  while ($offset = stripos($haystack,$needle,$offset)) $i++;
  return $i;
}
 
hab den fehler...

ich habe die funktion mit dem aufruf:
print str_count("foobarfoobarfoo","foo")."\r\n";
getestet.

Da foo als 1. an der 0. stelle gefunden wird gibt stripos() 0 zurück. und 0 wird mit FALSE verwechselt
 
Kannst ja in der while schleife die Bedingung so schreiben:
PHP:
(false !== ($offset = stripos(...)))

Wenn du zählen willst (ohne Schleife), dann mit preg_match() und im pattern /i setzen für case-insensitive. Als dritten Parameter $param und diesen zählen $cnt = count($param)-1

Alternativ kannst du auch den $string mit strtolower() erstmal in einer temporären Variable $stringLower ablegen und dort die $needle mit substr_count() zählen ($needle auch strtolower()).

Gruß
 
Hallo,

hab gelesen dass !== nur in php4 geht. habs mit "if (stripos(...)===FALSE) break" gelöst.
und zwar so:
PHP:
  function str_count($haystack,$needle) {
    $offset = 0;
    $i = 0;
    while (TRUE) {
      $offset = stripos($haystack,$needle,$offset);
      if ($offset===FALSE) break;
      $i++;
      $offset++;
    }
    return $i;
  }
da muss eh noch $offset++ weil der sonst immer an der gleichen stelle stripos macht.

aber preg_match ist keine schlechte idee, aber muss ich dann nicht preg_match_all nehmen. Und dann brauch ich kein count, weil mir preg_match_all() gleich noch die anzahl ausgibt.

Also danke für deinen tip, er vereinfacht meine funktion ;)
 
Glück auf Schneemann,
Hallo,

hab gelesen dass !== nur in php4 geht. habs mit "if (stripos(...)===FALSE) break" gelöst.
Ich hab hier zuhause Php >5.1 laufen und das funtioniert wunderbar. Wird auf der php.net - Seite auch an mehreren Stellen ausdrücklich empfohlen diese negative eineindeutige Prüfung.
und zwar so:
PHP:
  function str_count($haystack,$needle) {
    ...
  }
da muss eh noch $offset++ weil der sonst immer an der gleichen stelle stripos macht.
ich hab es mal mit einer for-Schleife probiert:
PHP:
function str_count_2($haystack, $needle){
	for($offset=$i=0; $offset<strlen($haystack) && false!==($offset=stripos($haystack, $needle, $offset));$offset++){
		$i++;
	}

	return $i;
}
$pattern = array('foofoobarfoofoobarfoo','barbarbar','foofoofoo');
$match = 'foo';
foreach($pattern as $val){
     echo $str_count_2($val, $match), '<br />';
}

# liefert:
# 5
# 0
# 3
aber preg_match ist keine schlechte idee, aber muss ich dann nicht preg_match_all nehmen. Und dann brauch ich kein count, weil mir preg_match_all() gleich noch die anzahl ausgibt.

Also danke für deinen tip, er vereinfacht meine funktion ;)
Stimmt. :)
 

Ähnliche Themen

[PHP] Autologin-Funktion

NagiosGrapher 1.7.1 funktioniert nicht

skript aus der kommandozeile starten

Xubuntu - AVR32-linux crosscompile sqlite

Zeichenketten

Zurück
Oben