Es, definitivamente, en dirección a la tierra de micro optimización, pero oye: el código en el que estoy trabajando mastica millones de artículos todos los días y es viernes. Así que hice un poco de experimentación ...
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)) { ... }
}
que luego corrió las pruebas anteriores, tanto para los valores de número entero y la cadena
Opción 1: fundición sencilla/equivalencia pruebas
- Entero: 0.3s
- Cadena: 0.4s
Opción 2: usando is_int() y ctype_digit()
- Entero: 0,9 segundos
- de la secuencia: 1.45s
Opción 3: expresiones regulares
- Entero: 1.83s
- Cadena: 1.60s
Tal como era de esperar, la opción 1 es, con mucho, el más rápido, ya que no hay no hay llamadas a funciones, solo casting. También vale la pena señalar que a diferencia de otros métodos, la opción 1 trata el valor de cadena por flotación entero "5.0" como un entero:
$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
Independientemente de si eso es una buena cosa para su uso-caso particular se deja como un ejercicio para el lector ...
la última comprobación es solo para ver si el número es un número entero. El uso de este cheque realmente depende de sus requisitos – Ass3mbler
... Está buscando un número negativo en el código actualmente. – JeroenEijkhof
¡Reparado! Lo siento por eso. – geerlingguy