Какой метод является предпочтительным strstr или strpos?

Я заметил, что многие разработчики используют strstr и strpos для проверки существования подстроки. Является ли один из них предпочтительным и почему?

  • Получить корневой узел XML-документа с помощью simplexml
  • PHP-шрифт-lib должен либо быть установлен через композитор, либо скопирован в lib / php-font-lib
  • Выполнить PHP-скрипты в веб-сервере Node.js
  • PHP Xpath: получить все значения href, содержащие иглу
  • Что такое временная метка Unix и зачем ее использовать?
  • Принудительная перезагрузка / обновление при нажатии кнопки «Назад»
  • Как использовать memcache с php
  • Найти последнего символа в строке в PHP
  • mysql_fetch_array добавить все строки?
  • Установка CodeIgniter в корневом каталоге и WordPress в подкаталоге
  • Как кэшировать динамическую страницу PHP
  • PHP Linefeeds (\ n) не работает
  • 5 Solutions collect form web for “Какой метод является предпочтительным strstr или strpos?”

    Из онлайн-руководства по PHP:

    Если вы хотите только определить, существует ли конкретная игла в стоге сена, используйте вместо нее более быструю и менее интенсивную память strpos ().

    Вот некоторые другие ответы (+ тесты). Я дошел до моего вопроса, который почти такой же (я не понимал, что вы спрашиваете).


    Тем временем я также сделал свой собственный контрольный тест, который я выполнил 1000000 раз для каждой соответствующей функции ( strstr() , strpos() , stristr() и stripos() ).
    Вот код:

     <?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>'; ?> 

    И вот первый вывод, который показывает, что strpos() является победителем :

     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 

    Следующий из них похож на первый результат ( strpos() снова побеждает):

     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 

    Ниже приведен еще один, что более интересно, потому что в этом случае strstr() является победителем:

     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 

    Это означает, что он действительно может зависеть от «условий окружающей среды» , которые иногда трудно влиять, и может изменить результат «задач микрооптимизации», как это, если вы просто проверяете, существует ли строка в другой или нет.

    НО я думаю, что в большинстве случаев strpos() является победителем по сравнению с strstr() .

    Надеюсь, этот тест был полезен для кого-то.

    Многие разработчики используют strpos для целей микро оптимизации .

    Использование strstr также работает только в том случае, если результирующая строка не может быть интерпретирована как ложная в булевом контексте.

    strpos () определяет, где в стоге сена находится конкретная игла. stristr () проверяет, находится ли игла в любом месте стога сена

    поэтому strpos () быстрее и меньше потребляет память

    причина для strstr (): если ваша игла находится в начале строки, strpos возвращает 0 (так что нужно проверить ее с помощью === false)

    Я предпочитаю strstr() для удобочитаемости и легкого кодирования .. strpos() !==false немного запутывает ..

    PHP is the Best Programming Language in the world.