Frage

Ich habe festgestellt, dass viele Entwickler sowohl STRSTR- als auch Strpos verwenden, um nach einem Substring -Existenz zu suchen. Ist einer von ihnen bevorzugt und warum?

War es hilfreich?

Lösung

Aus dem PHP Online -Handbuch:

Wenn Sie nur feststellen möchten, ob eine bestimmte Nadel im Heuhaufen auftritt, verwenden Sie die schnellere und weniger speicherintensive Funktion strpos()stattdessen.

Andere Tipps

Hier sind einige andere Antworten (+Benchmarks), die ich zu meiner Frage bekam, was ist fast Das gleiche (ich habe deine nicht realisiert, als ich gefragt habe).


In der Zwischenzeit habe ich auch meinen eigenen Benchmark -Test durchgeführt, den ich für jede relevante Funktionen 1000000 Mal durchgeführt habe (strstr(), strpos(), stristr() und stripos()).
Hier ist der Code:

<?php

function getmicrotime() {
    list($usec, $sec) = explode(" ", microtime());
    return ((float) $usec + (float) $sec);
}

$mystring = 'blahblahblah';  
$findme = 'bla';  

echo 'strstr & strpos TEST:<pre>';
$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) strstr($mystring, $findme);
$time_needed_strstr = getmicrotime() - $time_start;
echo 'strstr():            ',
    round( $time_needed_strstr , 8 ). PHP_EOL;

$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) stristr($mystring, $findme);
$time_needed_stristr = getmicrotime() - $time_start;
echo 'stristr():           ',
    round( $time_needed_stristr , 8 ) . PHP_EOL;

$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) strpos($mystring, $findme) !== false;
$time_needed_strpos = getmicrotime() - $time_start;
echo 'strpos() !== false:  ',
    round( $time_needed_strpos , 8 ) . PHP_EOL;

$time_start = getmicrotime();
for($i=0; $i<1000000; $i++) stripos($mystring, $findme) !== false;
$time_needed_stripos = getmicrotime() - $time_start;
echo 'stripos() !== false: ',
    round( $time_needed_stripos , 8 ) . PHP_EOL;

echo PHP_EOL;

echo 'time_needed_stristr - time_needed_strstr: ',
     round( $time_needed_stristr - $time_needed_strstr , 8) . PHP_EOL;
echo 'time_needed_stripos - time_needed_strpos: ',
     round( $time_needed_stripos - $time_needed_strpos , 8) . PHP_EOL;

echo PHP_EOL;

echo 'time_needed_strstr  - time_needed_strpos:  ',
     round( $time_needed_strstr - $time_needed_strpos , 8) . PHP_EOL;
echo 'time_needed_stristr - time_needed_stripos: ',
     round( $time_needed_stristr - $time_needed_stripos , 8) . PHP_EOL;

echo '</pre>';

?>

Und hier ist die erste Ausgabe, die das zeigt strpos() ist der Gewinner:

strstr & strpos TEST:
strstr():            2.39144707
stristr():           3.65685797
strpos() !== false:  2.39055395
stripos() !== false: 3.54681897

time_needed_stristr - time_needed_strstr: 1.2654109
time_needed_stripos - time_needed_strpos: 1.15626502

time_needed_strstr  - time_needed_strpos:  0.00089312
time_needed_stristr - time_needed_stripos: 0.110039 

Der nächste ähnelt der ersten Ausgabe (strpos() ist wieder der Gewinner):

strstr & strpos TEST:
strstr():            2.39969015
stristr():           3.60772395
strpos() !== false:  2.38610101
stripos() !== false: 3.34951186

time_needed_stristr - time_needed_strstr: 1.2080338
time_needed_stripos - time_needed_strpos: 0.96341085

time_needed_strstr  - time_needed_strpos:  0.01358914
time_needed_stristr - time_needed_stripos: 0.25821209

Unten ist ein anderer, was interessanter ist, weil in diesem Fall, strstr() ist der Gewinner:

strstr & strpos TEST:
strstr():            2.35499191
stristr():           3.60589004
strpos() !== false:  2.37646604
stripos() !== false: 3.51773095

time_needed_stristr - time_needed_strstr: 1.25089812
time_needed_stripos - time_needed_strpos: 1.14126492

time_needed_strstr  - time_needed_strpos:  -0.02147412
time_needed_stristr - time_needed_stripos: 0.08815908

Das heisst Es kann wirklich von "Umweltumständen" abhängen, die manchmal schwer zu beeinflussen sind und das Ergebnis von "Micro -Optimierungsaufgaben" wie diesen verändern können, falls Sie nur überprüfen, ob eine Zeichenfolge in einem anderen vorhanden ist oder nicht.

Aber ich denke in den meisten Fällen, strpos() ist der Gewinner im Vergleich zu strstr().

Ich hoffe, dieser Test war für jemanden nützlich.

Viele Entwickler verwenden strpos zum Mikrooptimierung Zwecke.

Verwendung strstr funktioniert auch nur, wenn die resultierende Zeichenfolge im booleschen Kontext nicht als falsch interpretiert werden kann.

Strpos () erkennt, wo im Heuhaufen eine bestimmte Nadel liegt. Stristr () testet, ob sich die Nadel überall im Heuhaufen befindet

Daher ist Strpos () schneller und weniger Speicherverbrauch

Ein Grund für strstr (): Wenn Ihre Nadel am Anfang einer Zeichenfolge steht, gibt Strpos 0 zurück (müssen sie also mit === false überprüfen)

ich bevorzuge strstr() Für Lesbarkeit und einfache Codierung .. strpos() !==false ist ein bisschen verwirrend ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top