Tôi nhận thấy rất nhiều nhà phát triển đang sử dụng cả strstr và strpos để kiểm tra sự tồn tại của chuỗi con. Có phải một trong số họ được ưa thích và tại sao?
Câu trả lời:
Từ hướng dẫn sử dụng PHP trực tuyến :
Nếu bạn chỉ muốn xác định xem một cây kim cụ thể có xuất hiện trong đống cỏ khô hay không, hãy sử dụng chức năng nhanh hơn và ít tốn bộ nhớ hơn
strpos()
.
if(strpos($haystack,$needle) !== false) { // do something }
, không bao giờ if(strpos($haystack,$needle)) { // do bad things }
. strpos
sẽ trả về 0 nếu giá trị $needle
ở đầu $haystack
và 0 được coi là sai. (0 == false)
đánh giá đúng. (0 === false)
đánh giá thành false.
Đây là một số câu trả lời khác (+ điểm chuẩn) mà tôi nhận được cho câu hỏi của mình, câu này cũng gần giống (tôi không nhận ra câu trả lời của bạn khi hỏi).
Trong khi chờ đợi tôi cũng đã thử nghiệm benchmark của riêng tôi, mà tôi chạy 1000000 lần cho mỗi chức năng có liên quan ( strstr()
, strpos()
, stristr()
và stripos()
).
Đây là mã:
<?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>';
?>
Và đây là kết quả đầu tiên, cho thấy đó strpos()
là người chiến thắng :
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
Kết quả tiếp theo tương tự với kết quả đầu tiên (lại strpos()
là người chiến thắng):
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
Dưới đây là một cái khác, thú vị hơn, vì trong trường hợp này, strstr()
là người chiến thắng:
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
Điều này có nghĩa là nó thực sự có thể phụ thuộc vào "hoàn cảnh môi trường" , đôi khi khó ảnh hưởng và có thể thay đổi kết quả của "nhiệm vụ tối ưu hóa vi mô" như thế này, trong trường hợp bạn chỉ đang kiểm tra xem một chuỗi có tồn tại trong một chuỗi khác hay không.
NHƯNG tôi nghĩ trong hầu hết các trường hợp, strpos()
là người chiến thắng so với strstr()
.
Tôi hy vọng bài kiểm tra này hữu ích cho ai đó.
Nhiều nhà phát triển sử dụng strpos
cho các mục đích tối ưu hóa vi mô .
Việc sử dụng strstr
cũng chỉ hoạt động nếu chuỗi kết quả không thể được hiểu là sai trong ngữ cảnh boolean.
strpos()
. Nếu tôi muốn chuỗi con sau vị trí đó, tôi sẽ gọi strstr()
.
strstr
làm được nhiều hơn mức cần thiết, đó là lý do tại sao nó chậm hơn.
strpos () phát hiện vị trí của một cây kim cụ thể trong đống cỏ khô. stristr () kiểm tra xem kim có ở bất kỳ đâu trong đống cỏ khô hay không
therefor strpos () nhanh hơn và ít tốn bộ nhớ hơn
một lý do cho strstr (): nếu kim của bạn ở đầu một chuỗi, strpos trả về 0 (vì vậy phải kiểm tra nó với === false)
strstr()
trả về mọi thứ trước hoặc sau kim, vì vậy trước tiên nó phải làm tương đương với strpos()
và sau đó tạo chuỗi con đó . Đó là nơi đạt được hiệu suất.
Tôi thích tính strstr()
dễ đọc và mã hóa dễ dàng .. strpos() !==false
hơi khó hiểu ..
strstr
là quá tương tự nhưstrtr
strstr
cũng cần so sánh chặt chẽ Ví dụ:('123450', '0')