La vérification de tableaux vides: le comte vs vide
Cette question sur " laComment savoir si un tableau PHP est vide' m'a fait penser à cette question
Est-il une raison que count
doit être utilisé au lieu de empty
au moment de déterminer si un tableau est vide ou pas?
Ma pensée personnelle serait le cas si les 2 sont équivalents pour le cas de tableaux vides, vous devez utiliser empty
parce qu'il donne une valeur booléenne réponse à un booléen question. À partir de la question ci-dessus, il semble que count($var) == 0
est la méthode populaire. Pour moi, bien que techniquement correct, n'a pas de sens. E. g. Q: $var, êtes vous vide? A: 7. Hmmm...
Est-il une raison que je devrais utiliser count == 0
au lieu de cela ou tout simplement une question de goût personnel?
Comme souligné par d'autres dans les commentaires pour maintenant supprimé réponse, count
aura un impact sur les performances pour les grands tableaux, car il devra compter tous les éléments, tandis que empty
pouvez arrêter dès qu'il sait qu'il n'est pas vide. Donc, si ils donnent les mêmes résultats dans le cas présent, mais count
est potentiellement inefficace, pourquoi n'aurions-nous jamais utiliser count($var) == 0
?
- Je suis en supposant que votre intention est de limiter la conversation exclusivement à des tableaux, mais il pourrait être intéressant de noter que le jeu change du tout au tout si vous travaillez avec des objets (par exemple, qui mettent en œuvre Dénombrable, Itérateur, etc.).
- Un tableau vide est égale à
false
en PHP, pas besoin deempty()
oucount()
. - Le Code s'il vous plaît.
- Comme dans, il suffit de faire:
if (!$myArray) { echo "array is empty"; }
sandbox.onlinephpfunctions.com/code/... - De nos jours, l'option populaire dans la question est à l'aide de
empty()
.
Vous devez vous connecter pour publier un commentaire.
J'utilise généralement
empty
. Je ne sais pas pourquoi les gens utiliseraient comptent vraiment - Si le tableau est grand alors le comte prend plus de temps a plus de frais généraux. Si vous avez simplement besoin de savoir si le tableau est vide, puis utilisez vide.O(1)
, depuis PHP stocke le nombre d'éléments à l'interne. Découvrez cette réponse stackoverflow.com/a/5835419/592454count()
avec des formes ayant plusieurs les entrées avec le même nom le comte champs vides, conduisant à des erreurs.isset($this->member) && !empty($this->member)
empty()
parce que c'est de la merde. Trop indulgent, a un comportement étrange comme retourner false, même pourstring('0')
, etc. Si vous avez un tableau et que vous souhaitez vérifier si elle est vide, soit utilisercount() === 0
ce qui est bien lisible et plus claire ou - si vous absolument besoin de la vitesse - utilisation$array === []
(aka$array === array()
) qui est presque aussi rapide queempty()
. À l'aide decount()
a, cependant, un avantage de plus - si vous décidez plus tard que vous souhaitez échanger votre tableau pour quelque chose de plus intelligent (comme dans l'objet de la mise en œuvre d'au moinsCountable
) vous n'aurez pas à changer quoi que ce soit.count(0) === int(1)
. J'ai une fonction qui a retourné 0 au lieu d'une chaîne vide en cas d'erreur. Ce pourrait être la mise en œuvre de la faute, mais je m'attends à un "lâche l'égalité pour une chaîne vide (false)" seracount
à 0. Peut-être que le mieux est$array === []
et n'utilisant aucun des deuxJ'étais curieux de voir qui était vraiment le plus rapide alors j'ai fait un simple script de test de ces fonctions.
Depuis que je le faisais j'ai aussi essayé de vérifier les performances de faire les opérations qui sont normalement associés avec count()/empty()
À l'aide de PHP 5.4.39:
À l'aide de HipHop VM 3.6.1 (dbg)
Conclusions si vous utilisez PHP:
empty() est beaucoup plus rapide que la fonction count() dans les deux scénarios, avec un vide et remplie tableau
count() effectue le même avec une pleine ou vide.
Faisant un simple SI ou tout simplement d'une opération Booléenne est le même.
If/ELSE est très légèrement plus efficace que le ( ? : ). Sauf si vous êtes en train de faire des milliards d'itérations avec des expressions dans le milieu, il est totalement insignifiant.
Conclusions si vous utilisez HHVM:
empty() est une teeny-weeny peu plus rapide que la fonction count (), mais d'une manière insignifiante, donc.
[ Le reste est le même que dans PHP ]
En conclusion de la conclusion, si vous avez juste besoin de savoir si le tableau est vide toujours utiliser empty();
C'était juste un curieux essai fait simplement, sans prendre beaucoup de choses en compte. C'est juste une preuve de concept et pourrait ne pas refléter les opérations de production.
if($x){
est plus rapide queif(empty($x)){
(fonctionne uniquement si vous savez que$x
a été déclaré).Je pense que c'est juste une préférence personnelle. Certaines personnes pourraient dire
empty
est plus rapide (par exemple,http://jamessocol.com/projects/count_vs_empty.php), tandis que d'autres pourraient direcount
est mieux depuis qu'il a été à l'origine fait pour les tableaux.empty
est plus générale et peut être appliquée à d'autres types.php.net donne l'avertissement suivant à
count
si :En d'autres termes, si la variable n'est pas définie, vous recevrez un avis de PHP en disant que c'est pas défini. Par conséquent, avant d'utiliser
count
, il serait préférable de vérifier la variable avecisset
. Ce n'est pas nécessaire avecempty
.count
est qu'il a été à l'origine fait pour les tableaux... et pourtant, les objets peuvent mettre en œuvreCountable
, et vous pouvez passer des valeurs scalaires àcount()
et d'obtenir un résultat valable.isset()
point. Si vous êtes inquiet au sujet de avis en PHP, tu devrais déjà avoir déclaré votre tableau. Si vous laissez PHP dynamiquement déclarer votre tableau, vous obtenez un avis à ce point. Je pense que le vrai point de la mise en garde sur php.net c'est que vous ne devriez pas utilisercount
pour déterminer si un tableau a été déclarée ou non car il donne le même résultat comme un tableau vide serait.Il est, quand vous avez besoin de faire quelque chose sur la non-vide en sachant qu'il est de taille:
Mais je ne recommanderais pas à l'aide de compter, sauf si vous êtes sûr à 100%, que ce que vous êtes de comptage est un tableau. Dernièrement, j'ai été mise au point du code, où sur la fonction d'erreur est de retour
FALSE
au lieu de tableau vide, et de ce que j'ai découvert était:de sortie:
Donc, depuis lors, je suis en utilisant
empty
ouif(array() === $array)
pour être sûr que j'ai tableau qui est vide.count()
semble mieux travailler avec l'ensemble-comme des interfaces de mettre en œuvreArrayAccess/Countable
.empty()
retourne true pour ces sortes d'objets, même si ils n'ont pas d'éléments. Généralement, ces classes permettent de mettre en œuvre lesCountable
interface, donc si la question est "est-ce de la collection contiennent des éléments?" sans faire d'hypothèse sur la mise en œuvre, puiscount()
est une meilleure option.empty
retourne false pour ces sortes d'objets, même si ils n'ont pas d'éléments"?count
serait un plus flexible et extensible solution si jamais il fait sens pour que votre code à accepter une collection mise en œuvre d'un "bien commun" de la sorte... de l'OMI qui pourrait être les seuls critères pertinents pour définir si vous utilisezcount
ou d'autres moyens...count()
que de 7,2, c'est qu'il n'a plus vide de variables.Alternativement, vous pouvez lancer la variable booléenne (implicitement ou explicitement):
Cette méthode génère un
E_NOTICE
si la variable n'est pas définie, de même pourcount()
.Pour plus d'informations, voir le Manuel PHP de la page sur les comparaisons de type.
empty()
si vous êtes explicitement en essayant d'éviter le déclenchement d'une alerte de type E_NOTICE (qui est généralement une mauvaise idée, de l'OMI). De façon flagrante à l'aide de vide conduira à code bogué.Ma préférence personnelle est plus pour le codage de l'élégance (par rapport à mon cas d'utilisation). Je suis d'accord avec Dan McG en ce qui count() n'est pas de répondre avec le bon type de données (dans ce cas, boolean) pour le test en question de forcer les développeurs à écrire plus de code pour remplir une déclaration "if".
Si cela a un impact important sur les performances est seulement discutable pour les très grandes matrices (dont vous n'aurez probablement pas assez de mémoire pour l'allocation de toute façon dans la plupart des configurations).
En particulier quand il s'agit de PHP $_POST tableau, il semble beaucoup plus "logique" à mon avis, pour écrire à voir:
Espère que cela peut aider quelqu'un, même s'il a déjà été répondu (et ont discuté des ce). Dans mon scénario, je sais que tous mes tableaux ont tous 7 éléments (vérifications ont été faites plus tôt dans mon code) et je suis de l'exécution d'une
array_diff
qui, bien sûr, retourne un tableau de zéro, lorsque l'égalité.J'ai eu 34 sec pour
count
et 17 sec pourempty
. Les deux me donner les mêmes calculs pour que mon code est toujours bien.Cependant, vous pouvez également essayer les
==
ou===
comme dans PHP - Vérifier si deux matrices sont égales. Le mieux que je voudrais dire, c'est essayercount
vsempty
vs== empty array
, puis voir ce qui donne à votre propre meilleur perfs. Dans mon cas,count
était le plus lent, de sorte je suis en utilisantempty
maintenant... allons vérifierserialize
prochaineIl n'y a aucune raison de préférer
count($myArray) == 0
surempty($myArray)
. Ils ont la même sémantique. Certains pourraient trouver un plus lisible que l'autre. On peut effectuer un peu meilleure que l'autre, mais il n'est pas susceptible d'être un facteur important dans la grande majorité des applications php. À toutes fins pratiques, le choix est une question de goût.count
lorsque vous avez besoin de compter, utiliserempty
lorsque vous avez besoin de vérifier si la collection est vide. Bien sûr il y a des cas limites comme les chaînes ou les valeurs null, mais le programmeur doit penser à son code. Vous pouvez être en désaccord, vous êtes autorisé à le faire.Parfois à l'aide de vide est un must. Par exemple ce code:
Si vous exécutez ce code comme ceci: http://phpfiddle.org/main/code/g9x-uwi
Vous obtenez ce résultat:
Donc, si vous
count
le vide glob sortie vous mal sortie. Vous devriez vérifier le vide.De glob documentation:
Également vérifier à cette question:
Pourquoi le comte(false) return 1?
J'ai refait mon esprit les gars, merci.
Ok, il n'y a pas de différence entre l'utilisation de
empty
etcount
. Techniquement,count
doit être utilisé pour les tableaux, etempty
pourrait être utilisé pour les tableaux ainsi que des chaînes de caractères. Donc, dans la plupart des cas, ils sont interchangeables et si vous voyez le php docs, vous verrez la liste de suggestion decount
si vous êtes àempty
et vice versa.Depuis une variable analysée comme négatif serait de retour
int(1)
aveccount()
Je préfère
($array === [] || !$array)
de test pour un tableau vide.Oui, nous devrions nous attendre à un tableau vide, mais il ne faut pas s'attendre à une bonne mise en œuvre sur les fonctions sans retour forcé types.
Exemples avec
count()