Это определенно движется к стране микрооптимизации, но, эй: код, над которым я работаю, каждый день переживает миллионы пунктов, и сегодня пятница.Поэтому я немного поэкспериментировал ...
for ($i = 0; $i < 1000000; $i++) {
// Option 1: simple casting/equivalence testing
if ((int) $value == $value && $value > 0) { ... }
// Option 2: using is_int() and ctype_digit(). Note that ctype_digit implicitly rejects negative values!
if ((is_int($value) && $value > 0) || ctype_digit($value)) { ... }
// Option 3: regular expressions
if (preg_match('/^\d+$/', $value)) { ... }
}
Затем я запустил вышеупомянутые тесты для целочисленных и строковых значений
Вариант 1: простое приведение типов к типу / эквивалентности
- Целое число: 0,3 с
- Строка: 0,4 с
Опция 2: использование is_int () и ctype_digit ()
- Целое число: 0,9 с
- Строка: 1,45 с
Опция 3: регулярные выражения
- Целое число: 1,83 с
- Строка: 1,60 с
Возможно, неудивительно, что вариант 1 является самым быстрым, поскольку нет вызовов функций, только приведение.Также стоит отметить, что в отличие от других методов, вариант 1 обрабатывает значение string-float-integer «5.0» как целое число:
$valList = array(5, '5', '5.0', -5, '-5', 'fred');
foreach ($valList as $value) {
if ((int) $value == $value && $value > 0) {
print "Yes: " . var_export($value, true) . " is a positive integer\n";
} else {
print "No: " . var_export($value, true) . " is not a positive integer\n";
}
}
Yes: 5 is a positive integer
Yes: '5' is a positive integer
Yes: '5.0' is a positive integer
No: -5 is not a positive integer
No: '-5' is not a positive integer
No: 'fred' is not a positive integer
Является ли это хорошим вариантом для вашего конкретного варианта использования,оставлено в качестве упражнения для читателя ...