Тільки для ударів я протестував декілька згаданих методів, а також один, який я використовував як рішення для переходу протягом багатьох років, коли знаю, що моє введення - це позитивне число або еквівалент рядка.
Я перевірив це за допомогою 125000 ітерацій, причому кожна ітерація передавалась в одному наборі типів змінних та значень.
Спосіб 1: is_int($value) || ctype_digit($value)
Спосіб 2: (string)(int)$value == (string)$value
Спосіб 3: strval(intval($value)) === strval($value)
Спосіб 4: ctype_digit(strval($value))
Спосіб 5: filter_var($value, FILTER_VALIDATE_INT) !== FALSE
Спосіб 6: is_int($value) || ctype_digit($value) || (is_string($value) && $value[0] === '-' && filter_var($value, FILTER_VALIDATE_INT) !== FALSE)
Метод 1: 0,0552167892456
Метод 2: 0,126773834229
Метод 3: 0,143012046814
Метод 4: 0,0979189872742
Метод 5: 0,112988948822
Метод 6: 0,0858821868896
(Я навіть не тестував регулярний вираз, я маю на увазі серйозно ... регулярний вираз для цього?)
Що слід зазначити:
Метод 4 завжди повертає значення false для від’ємних чисел (від’ємне ціле число або еквівалент рядка), тому це хороший метод для послідовного виявлення того, що значення є додатним цілим числом.
Метод 1 повертає true для від'ємного цілого числа, але false для рядкового еквівалента від'ємного цілого числа, тому не використовуйте цей метод, якщо ви не впевнені, що ваші дані ніколи не будуть містити від'ємне число у формі рядка або цілого числа, і що якщо це так , ваш процес не зламається від такої поведінки.
Висновки
Отже, якщо ви впевнені, що ваші дані не включатимуть від’ємне число, то це майже вдвічі швидше використовувати is_intі ctype_digitперевірити, що у вас ціле число. Використання методу 1 із запасним способом до методу 5, коли змінною є рядок, а першим символом є тире, є наступним найшвидшим (особливо, коли більшість вхідних даних - це фактичні цілі числа або додатні числа в рядку). Загалом, якщо вам потрібна тверда узгодженість, і ви не уявляєте, яка суміш даних надходить, і ви повинні послідовно обробляти негативи, filter_var($value, FILTER_VALIDATE_INT) !== FALSEвиграє.
Код, який використовується для отримання вихідних даних вище:
$u = "-10";
$v = "0";
$w = 0;
$x = "5";
$y = "5c";
$z = 1.44;
function is_int1($value){
return (is_int($value) || ctype_digit($value));
}
function is_int2($value) {
return ((string)(int)$value == (string)$value);
}
function is_int3($value) {
return (strval(intval($value)) === strval($value));
}
function is_int4($value) {
return (ctype_digit(strval($value)));
}
function is_int5($value) {
return filter_var($value, FILTER_VALIDATE_INT) !== FALSE;
}
function is_int6($value){
return (is_int($value) || ctype_digit($value) || (is_string($value) && $value[0] === '-' && filter_var($value, FILTER_VALIDATE_INT)) !== FALSE);
}
$start = microtime(TRUE);
for ($i=0; $i < 125000; $i++) {
is_int1($u);
is_int1($v);
is_int1($w);
is_int1($x);
is_int1($y);
is_int1($z);
}
$stop = microtime(TRUE);
$start2 = microtime(TRUE);
for ($j=0; $j < 125000; $j++) {
is_int2($u);
is_int2($v);
is_int2($w);
is_int2($x);
is_int2($y);
is_int2($z);
}
$stop2 = microtime(TRUE);
$start3 = microtime(TRUE);
for ($k=0; $k < 125000; $k++) {
is_int3($u);
is_int3($v);
is_int3($w);
is_int3($x);
is_int3($y);
is_int3($z);
}
$stop3 = microtime(TRUE);
$start4 = microtime(TRUE);
for ($l=0; $l < 125000; $l++) {
is_int4($u);
is_int4($v);
is_int4($w);
is_int4($x);
is_int4($y);
is_int4($z);
}
$stop4 = microtime(TRUE);
$start5 = microtime(TRUE);
for ($m=0; $m < 125000; $m++) {
is_int5($u);
is_int5($v);
is_int5($w);
is_int5($x);
is_int5($y);
is_int5($z);
}
$stop5 = microtime(TRUE);
$start6 = microtime(TRUE);
for ($n=0; $n < 125000; $n++) {
is_int6($u);
is_int6($v);
is_int6($w);
is_int6($x);
is_int6($y);
is_int6($z);
}
$stop6 = microtime(TRUE);
$time = $stop - $start;
$time2 = $stop2 - $start2;
$time3 = $stop3 - $start3;
$time4 = $stop4 - $start4;
$time5 = $stop5 - $start5;
$time6 = $stop6 - $start6;
print "**Method 1:** $time <br>";
print "**Method 2:** $time2 <br>";
print "**Method 3:** $time3 <br>";
print "**Method 4:** $time4 <br>";
print "**Method 5:** $time5 <br>";
print "**Method 6:** $time6 <br>";