Esta pregunta sobre ' Cómo saber si una matriz PHP está vacía ' me hizo pensar en esta pregunta
¿Hay alguna razón que count
deba usarse en lugar de empty
cuando se determina si una matriz está vacía o no?
Mi pensamiento personal sería si los 2 son equivalentes para el caso de matrices vacías que debería usar empty
porque da una respuesta booleana a una pregunta booleana. De la pregunta vinculada anteriormente, parece que count($var) == 0
es el método popular. Para mí, aunque técnicamente es correcto, no tiene sentido. Por ejemplo, Q: $ var, ¿estás vacío? A: 7 . Mmmm ...
¿Hay alguna razón por la que deba usar count == 0
en su lugar o simplemente una cuestión de gusto personal?
Como lo señalaron otros en los comentarios para una respuesta ahora eliminada, count
tendrá un impacto en el rendimiento para matrices grandes porque tendrá que contar todos los elementos, mientras que empty
puede detenerse tan pronto como sepa que no está vacío. Entonces, si dan los mismos resultados en este caso, pero count
son potencialmente ineficientes, ¿por qué los usaríamos count($var) == 0
?
false
en PHP, sin necesidad deempty()
ocount()
.if (!$myArray) { echo "array is empty"; }
sandbox.onlinephpfunctions.com/code/…empty()
.Respuestas:
Yo generalmente uso
empty
. No estoy seguro de por qué la gente usaría realmente el recuento: si la matriz es grande, el recuento lleva más tiempo / tiene más gastos generales. Si simplemente necesita saber si la matriz está vacía o no, utilice vacía.fuente
O(1)
, ya que PHP almacena la cantidad de elementos internamente. Mira esta respuesta stackoverflow.com/a/5835419/592454Tenía curiosidad por ver cuál era en realidad más rápido, así que hice un script simple para comparar esas funciones.
Como lo estaba haciendo, también intenté verificar el rendimiento al realizar operaciones que normalmente estarían asociadas con count () / empty ()
Usando PHP 5.4.39:
Uso de HipHop VM 3.6.1 (dbg)
Conclusiones si está usando PHP:
empty () es mucho más rápido que count () en ambos escenarios, con una matriz vacía y poblada
count () realiza lo mismo con una matriz llena o vacía.
Hacer un IF simple o simplemente una operación booleana es lo mismo.
IF / ELSE es ligeramente más eficiente que (?:). A menos que esté haciendo miles de millones de iteraciones con expresiones en el medio, es completamente insignificante.
Conclusiones si está usando HHVM:
empty () es un poquito más rápido que count () pero insignificantemente.
[El resto es igual que en PHP]
En conclusión, si solo necesita saber si la matriz está vacía, utilice siempre empty ();
Esta fue solo una prueba curiosa simplemente hecha sin tener en cuenta muchas cosas. Es solo una prueba de concepto y podría no reflejar las operaciones en producción.
fuente
if($x){
es más rápido queif(empty($x)){
(solo funciona si sabes que$x
se ha declarado).count
yempty
llamadas en la declaración if. Luego viene elempty
y dura elcount
. Pero comparado con el tuyo en su caso, el vacío es diez veces más rápido Prueba de matriz simple: 0.104662, vacío: 0.177659, recuento: 1.175125 en PHP 5.6, de lo contrario, su código da el mismo resultado en esta versión también como lo mencionó. Solo son resultados falsos.Creo que es solo una preferencia personal. Algunas personas podrían decir que
empty
es más rápido (por ejemplo, http://jamessocol.com/projects/count_vs_empty.php ) mientras que otras podrían decir quecount
es mejor, ya que originalmente se hizo para matrices.empty
es más general y se puede aplicar a otros tipos.php.net da la siguiente advertencia
count
:En otras palabras, si la variable no está configurada, recibirá un aviso de PHP diciendo que no está definida. Por tanto, antes de usar
count
, sería preferible comprobar la variable conisset
. Esto no es necesario conempty
.fuente
count
sea que se hizo originalmente para matrices ... sin embargo, los objetos se pueden implementarCountable
y puedes pasar valores escalarescount()
y obtener un resultado válido.isset()
punto. Si le preocupan los avisos en PHP, ya debería haber declarado su matriz. Si deja que PHP declare dinámicamente su matriz, también recibirá un aviso en ese punto. Creo que el verdadero punto de la advertencia en php.net es que no debe usarcount
para determinar si una matriz ha sido declarada o no, ya que produce el mismo resultado que una matriz vacía.Hay, cuando necesita hacer algo en una matriz no vacía sabiendo su tamaño:
Pero no recomendaría usar count, a menos que esté 100% seguro de que lo que está contando es una matriz. Últimamente he estado depurando código, donde la función de error regresaba en
FALSE
lugar de una matriz vacía, y lo que descubrí fue:salida:
Entonces, desde entonces, estoy usando
empty
oif(array() === $array)
para estar seguro de que tengo una matriz vacía.fuente
count()
parece funcionar mejor con interfaces tipo matriz que implementanArrayAccess/Countable
.empty()
devuelve verdadero para este tipo de objetos incluso si no tienen elementos. Normalmente, estas clases implementarán laCountable
interfaz, por lo que si la pregunta es "¿Esta colección contiene elementos?" sin hacer una suposición sobre la implementación, entoncescount()
es una mejor opción.fuente
empty
devuelve falso para este tipo de objetos incluso si no tienen elementos"?count
sería una solución más flexible y extensible si alguna vez tiene sentido que su código acepte una colección implementada de una manera "común" ... OMI, ese podría ser el único criterio pertinente para definir si usacount
u otras formas ...count()
7.2 es que ya no puede tomar variables vacías.Alternativamente, puede convertir la variable como un booleano (implícita o explícitamente):
Este método genera un
E_NOTICE
si la variable no está definida, de manera similar acount()
.Para obtener más información, consulte la página del Manual de PHP sobre comparaciones de tipos .
fuente
empty()
si está tratando explícitamente de evitar activar un E_NOTICE (que generalmente es una mala idea, en mi opinión). El uso descarado de empty conducirá a un código defectuoso.Mi preferencia personal es más por la elegancia de la codificación (en relación con mi caso de uso específico). Estoy de acuerdo con Dan McG en la medida en que count () no responde con el tipo de datos correcto (en este caso booleano) para la prueba en cuestión, lo que obliga al desarrollador a escribir más código para completar una declaración 'if'.
Si esto tiene un impacto significativo en el rendimiento solo es discutible para arreglos extremadamente grandes (para los cuales probablemente no tendrá suficiente asignación de memoria en la mayoría de las configuraciones).
Particularmente cuando se trata de la matriz $ _POST de PHP, parece mucho más "lógico" en mi opinión escribir / ver:
fuente
Espero que esto pueda ayudar a alguien a pesar de que ya ha sido respondido (y debatido algo sobre qué). En mi propio escenario, sé que todas mis matrices tienen 7 elementos (las verificaciones se realizaron anteriormente en mi código) y estoy realizando una
array_diff
que, por supuesto, devuelve una matriz de cero cuando es igual.Tuve 34 segundos para
count
y 17 segundos paraempty
. Ambos me dan los mismos cálculos, por lo que mi código sigue estando bien.Sin embargo, también puede probar
==
o===
como en PHP: compruebe si dos matrices son iguales . Lo mejor que diría es probarcount
vsempty
vs== empty array
, luego ver cuál da sus mejores resultados. En mi casocount
fue el más lento, así que lo estoy usandoempty
ahora ... lo veré aserialize
continuaciónfuente
No hay una fuerte razón para preferir
count($myArray) == 0
másempty($myArray)
. Tienen una semántica idéntica. Algunos pueden encontrar uno más legible que el otro. Uno puede funcionar ligeramente mejor que el otro, pero no es probable que sea un factor significativo en la gran mayoría de las aplicaciones php. A todos los efectos prácticos, la elección es cuestión de gustos.fuente
count
cuando necesite contar, utilíceloempty
cuando necesite verificar si la colección está vacía. Por supuesto, hay casos extremos como cadenas o nulos, pero el programador debe pensar en su código. Puede no estar de acuerdo, está permitido.A veces, usar vacío es imprescindible. Por ejemplo este código:
Si ejecuta este código así: http://phpfiddle.org/main/code/g9x-uwi
Obtienes esta salida:
Así que si usted
count
obtiene la salida glob vacía, obtendrá una salida incorrecta. Debes comprobar si hay vacío.De la documentación glob :
También verifique esta pregunta: ¿Por qué contar (falso) devolver 1?
fuente
Dado que una variable analizada como negativa volvería
int(1)
concount()
Prefiero
($array === [] || !$array)
probar una matriz vacía.Sí, deberíamos esperar una matriz vacía, pero no deberíamos esperar una buena implementación en funciones sin tipos de retorno forzados.
Ejemplos con
count()
fuente
Rehice mi mente chicos, gracias.
Ok, no hay diferencia entre el uso de
empty
ycount
. Técnicamente,count
debería usarse para matrices yempty
podría usarse tanto para matrices como para cadenas. Entonces, en la mayoría de los casos, son intercambiables y si ve los documentos php, verá la lista de sugerencias decount
si está enempty
y viceversa.fuente