Ich habe festgestellt, dass viele Entwickler sowohl strstr als auch strpos verwenden, um nach einer Teilstring-Existenz zu suchen. Wird einer von ihnen bevorzugt und warum?
Wenn Sie nur feststellen möchten, ob eine bestimmte Nadel im Heuhaufen vorkommt, verwenden Sie strpos()
stattdessen die schnellere und weniger speicherintensive Funktion .
+1, Sie können Strpos oder Stripos verwenden. und vergessen Sie nicht, die Warnungen im PHP-Dokument über die Verwendung von === FALSE zu überprüfen;
Fedmich
7
Um auf Fedmichs Kommentar einzugehen: Ich benutze immer if(strpos($haystack,$needle) !== false) { // do something }, niemals if(strpos($haystack,$needle)) { // do bad things }. strposgibt 0 zurück, wenn das $needleganz am Anfang von steht $haystack, und 0 wird als gleich false angesehen. (0 == false)bewertet als wahr. (0 === false)ergibt false.
Buttle Butkus
1
Leute, die aus C kommen, denken vielleicht darüber nach, die strchr- Funktion zu verwenden, aber in PHP ist es tatsächlich ein Alias für strstr , daher ist strpos die bessere Wahl.
e2-e4
37
Hier sind einige andere Antworten (+ Benchmarks), die ich auf meine Frage erhalten habe, die fast dieselbe ist (Ihre habe ich beim Fragen nicht erkannt).
In der Zwischenzeit meine eigenen Benchmark - Test habe ich, was ich lief 1000000 mal auch für jede relevante Funktionen ( strstr(), strpos(), stristr()und stripos()).
Hier ist der Code:
Dies bedeutet, dass es wirklich von "Umgebungsbedingungen" abhängen kann , die manchmal schwer zu beeinflussen sind, und das Ergebnis solcher "Mikrooptimierungsaufgaben" ändern kann, falls Sie nur prüfen, ob eine Zeichenfolge in einer anderen vorhanden ist oder nicht.
ABER ich denke in den meisten Fällen strpos()ist der Gewinner im Vergleich zustrstr() .
Es handelt sich nicht um eine Mikrooptimierung, sondern um die Verwendung der richtigen Funktion für den Job . Wenn ich die Position der Zeichenfolge haben möchte, rufe ich an strpos(). Wenn ich den Teilstring nach dieser Position haben wollte, rufe ich an strstr().
Alnitak
1
@ Alnitak: Was ich gesagt habe. Wenn Sie prüfen möchten, ob eine Zeichenfolge vorhanden ist, gibt es dafür eine Funktion. Wenn Sie die Position tatsächlich brauchen, gibt es eine andere. - Wenn Sie nach der Position suchen, ohne die Position tatsächlich zu benötigen, dann ist das kaum "die richtige Funktion für den Job verwenden". Die Absicht ist eindeutig, Mikrosekunden entfernt zu optimieren. (Ist es nicht das, was Sie zitiert haben?)
Mario
1
@mario, aber es gibt keine Funktion, deren einziger Zweck darin besteht, zu überprüfen, ob ein Teilstring vorhanden ist. Die Position des Teilstrings (falls gefunden) ist eine freie Information, sobald Sie sie tatsächlich gefunden haben. OTOH strstrmacht mehr als nötig, weshalb es langsamer ist.
Alnitak
@Alnitak: Wohlgemerkt, keine Neuigkeiten. Sie scheinen sehr darauf bedacht zu sein, auf den Leistungsunterschied hinzuweisen, und nur das. Das ist ein verräterisches Zeichen für Mikrooptimierung. Es macht keinen Fehler im Profiler . Wo es einen Unterschied macht, ist die Lesbarkeit des Codes.
Mario
@mario eigentlich würde mich die leistung nur sehr wenig interessieren. Es ist mir sehr wichtig, die richtige Funktion für den Job zu verwenden ;-)
Alnitak
0
strpos () erkennt, wo im Heuhaufen eine bestimmte Nadel liegt. stristr () prüft, ob sich die Nadel irgendwo im Heuhaufen befindet
Daher ist strpos () schneller und weniger speicherintensiv
ein Grund für strstr (): Wenn sich Ihre Nadel am Anfang eines Strings befindet, gibt strpos 0 zurück (müssen Sie dies also mit === false überprüfen).
Das ist eine völlig falsche Erklärung - strstr()gibt alles vor oder nach der Nadel zurück, also muss es zuerst das Äquivalent von machen strpos()und dann diesen Teilstring erstellen . Hier liegt der Performance-Hit.
Alnitak
-2
Ich bevorzuge strstr()für Lesbarkeit und einfache Codierung .. strpos() !==false ist ein bisschen verwirrend ..
Antworten:
Aus dem PHP- Online-Handbuch :
quelle
if(strpos($haystack,$needle) !== false) { // do something }
, niemalsif(strpos($haystack,$needle)) { // do bad things }
.strpos
gibt 0 zurück, wenn das$needle
ganz am Anfang von steht$haystack
, und 0 wird als gleich false angesehen.(0 == false)
bewertet als wahr.(0 === false)
ergibt false.Hier sind einige andere Antworten (+ Benchmarks), die ich auf meine Frage erhalten habe, die fast dieselbe ist (Ihre habe ich beim Fragen nicht erkannt).
In der Zwischenzeit meine eigenen Benchmark - Test habe ich, was ich lief 1000000 mal auch für jede relevante Funktionen (
strstr()
,strpos()
,stristr()
undstripos()
).Hier ist der Code:
Und hier ist die erste Ausgabe, die zeigt, dass dies
strpos()
der Gewinner ist :Die nächste ähnelt der ersten Ausgabe (
strpos()
ist wieder der Gewinner):Unten ist eine andere, die interessanter ist, weil in diesem Fall
strstr()
der Gewinner ist:Dies bedeutet, dass es wirklich von "Umgebungsbedingungen" abhängen kann , die manchmal schwer zu beeinflussen sind, und das Ergebnis solcher "Mikrooptimierungsaufgaben" ändern kann, falls Sie nur prüfen, ob eine Zeichenfolge in einer anderen vorhanden ist oder nicht.
ABER ich denke in den meisten Fällen
strpos()
ist der Gewinner im Vergleich zustrstr()
.Ich hoffe, dieser Test war für jemanden nützlich.
quelle
Viele Entwickler verwenden
strpos
für Mikrooptimierungszwecke .Die Verwendung
strstr
funktioniert auch nur, wenn die resultierende Zeichenfolge im booleschen Kontext nicht als falsch interpretiert werden kann.quelle
strpos()
. Wenn ich den Teilstring nach dieser Position haben wollte, rufe ich anstrstr()
.strstr
macht mehr als nötig, weshalb es langsamer ist.strpos () erkennt, wo im Heuhaufen eine bestimmte Nadel liegt. stristr () prüft, ob sich die Nadel irgendwo im Heuhaufen befindet
Daher ist strpos () schneller und weniger speicherintensiv
ein Grund für strstr (): Wenn sich Ihre Nadel am Anfang eines Strings befindet, gibt strpos 0 zurück (müssen Sie dies also mit === false überprüfen).
quelle
strstr()
gibt alles vor oder nach der Nadel zurück, also muss es zuerst das Äquivalent von machenstrpos()
und dann diesen Teilstring erstellen . Hier liegt der Performance-Hit.Ich bevorzuge
strstr()
für Lesbarkeit und einfache Codierung ..strpos() !==false
ist ein bisschen verwirrend ..quelle
strstr
ist zu ähnlich zustrtr
strstr
braucht auch einen strengen Vergleich Beispiel:('123450', '0')