Esta questão em ' Como saber se um array PHP está vazio ' me fez pensar nesta questão
Existe um motivo que count
deve ser usado em vez de empty
determinar se um array está vazio ou não?
Minha opinião pessoal seria se os 2 são equivalentes para o caso de matrizes vazias que você deve usar empty
porque dá uma resposta booleana a uma pergunta booleana. Pela pergunta vinculada acima, parece que count($var) == 0
é o método popular. Para mim, embora tecnicamente correto, não faz sentido. Por exemplo, Q: $ var, você está vazio? A: 7 . Hmmm ...
Há algum motivo para eu usar em count == 0
vez disso ou apenas uma questão de gosto pessoal?
Conforme apontado por outros em comentários para uma resposta agora excluída, count
terá impactos no desempenho para grandes arrays porque terá que contar todos os elementos, enquanto empty
pode parar assim que souber que não está vazio. Portanto, se eles fornecem os mesmos resultados neste caso, mas count
são potencialmente ineficientes, por que usaríamos count($var) == 0
?
false
em PHP - não há necessidade deempty()
oucount()
.if (!$myArray) { echo "array is empty"; }
sandbox.onlinephpfunctions.com/code/…empty()
.Respostas:
Eu geralmente uso
empty
. Não sei por que as pessoas usariam a contagem - se a matriz for grande, a contagem leva mais tempo / tem mais sobrecarga. Se você simplesmente precisa saber se o array está vazio ou não, use empty.fonte
O(1)
, já que o PHP armazena o número de elementos internamente. Confira esta resposta stackoverflow.com/a/5835419/592454Eu estava curioso para ver qual era realmente mais rápido, então fiz um script simples para comparar essas funções.
Já que estava fazendo isso, também tentei verificar o desempenho fazendo operações que normalmente estariam associadas a count () / empty ()
Usando PHP 5.4.39:
Usando HipHop VM 3.6.1 (dbg)
Conclusões se você estiver usando PHP:
empty () é muito mais rápido que count () em ambos os cenários, com um array vazio e preenchido
count () executa o mesmo com um array cheio ou vazio.
Fazer uma operação IF simples ou apenas booleana é o mesmo.
IF / ELSE é ligeiramente mais eficiente do que (?:). A menos que você esteja fazendo bilhões de iterações com expressões no meio, é completamente insignificante.
Conclusões se você estiver usando HHVM:
empty () é um pouquinho mais rápido do que count (), mas insignificantemente.
[O resto é igual ao PHP]
Concluindo a conclusão, se você só precisa saber se o array está vazio, sempre use empty ();
Este foi apenas um teste curioso feito simplesmente sem levar muitas coisas em consideração. É apenas uma prova de conceito e pode não refletir as operações em produção.
fonte
if($x){
é mais rápido do queif(empty($x)){
(só funciona se você souber que$x
foi declarado).count
eempty
na instrução if. Então vem oempty
e dura ocount
. Mas em comparação com o seu caso, o vazio é dez vezes mais rápido! Teste de array simples: 0,104662, vazio: 0,177659, contagem: 1,175125 no PHP 5.6, caso contrário, seu código fornece o mesmo resultado nesta versão, como o mencionado. São resultados falsos.Acho que é apenas preferência pessoal. Algumas pessoas podem dizer que
empty
é mais rápido (por exemplo, http://jamessocol.com/projects/count_vs_empty.php ), enquanto outros podem dizer quecount
é melhor, já que foi feito originalmente para arrays.empty
é mais geral e pode ser aplicado a outros tipos.php.net dá o seguinte aviso para
count
:Em outras palavras, se a variável não for definida, você receberá um aviso do PHP informando que ela é indefinida. Portanto, antes de usar
count
, é preferível verificar a variável comisset
. Isso não é necessário comempty
.fonte
count
é que ele foi originalmente feito para arrays ... mas os objetos podem implementarCountable
e você pode passar valores escalarescount()
e obter um resultado válido.isset()
ponto. Se você está preocupado com avisos em PHP, você já deve ter declarado seu array. Se você permitir que o PHP declare dinamicamente seu array, você receberá um aviso nesse ponto também. Acho que o verdadeiro ponto do aviso no php.net é que você não deve usarcount
para determinar se um array foi declarado ou não, pois produz o mesmo resultado que um array vazio faria.Há, quando você precisa fazer algo em uma matriz não vazia sabendo seu tamanho:
Mas eu não recomendaria usar count, a menos que você tenha 100% de certeza de que o que você está contando é um array. Ultimamente tenho depurado o código, onde a função de erro estava retornando em
FALSE
vez do array vazio, e o que descobri foi:resultado:
Então desde então estou usando
empty
ouif(array() === $array)
para ter certeza que tenho array que está vazio.fonte
count()
parece funcionar melhor com interfaces semelhantes a array que implementamArrayAccess/Countable
.empty()
retorna true para esses tipos de objetos, mesmo se eles não tiverem elementos. Normalmente, essas classes implementam aCountable
interface, portanto, se a pergunta for "Esta coleção contém elementos?" sem fazer uma suposição sobre a implementação, entãocount()
é uma opção melhor.fonte
empty
retorna falso para esses tipos de objetos, mesmo se eles não tiverem elementos"?count
seria uma solução mais flexível e extensível se alguma vez fizesse sentido para o seu código aceitar uma coleção implementada de uma forma "comum" ... IMO que pode ser o único critério pertinente para definir se você usacount
ou de outras maneiras ...count()
7.2 é que ele não pode mais aceitar variáveis vazias.Como alternativa, você pode converter a variável como booleana (implícita ou explicitamente):
Este método gera um
E_NOTICE
se a variável não for definida, de forma semelhante acount()
.Para obter mais informações, consulte a página do Manual do PHP sobre comparações de tipo .
fonte
empty()
se estiver explicitamente tentando evitar o disparo de um E_NOTICE (o que geralmente é uma má ideia, IMO). Usar o vazio descaradamente levará a código com erros.Minha preferência pessoal é mais elegância de codificação (em relação ao meu caso de uso específico). Concordo com Dan McG na medida em que count () não está respondendo com o tipo de dados correto (neste caso, booleano) para o teste em questão, forçando o desenvolvedor a escrever mais código para preencher uma instrução 'if'.
Se isso tem algum impacto significativo no desempenho, só é discutível para arrays extremamente grandes (para os quais você provavelmente não terá alocação de memória suficiente na maioria das configurações).
Particularmente quando se trata do array $ _POST do PHP, parece muito mais "lógico" na minha opinião escrever / ver:
fonte
Espero que isso possa ajudar alguém, embora já tenha sido respondido (e debatido um pouco). Em meu próprio cenário, sei que todos os meus arrays têm 7 elementos (verificações foram feitas anteriormente em meu código) e estou executando um
array_diff
que, é claro, retorna um array de zero quando igual.Eu tive 34 segundos para
count
e 17 segundos paraempty
. Ambos me fornecem os mesmos cálculos, então meu código ainda está bom.No entanto, você também pode tentar o
==
ou===
como no PHP - Verifique se dois arrays são iguais . O melhor que eu diria é tentarcount
vsempty
vs== empty array
, então ver qual oferece seus melhores perfs. No meu casocount
foi o mais lento então estou usandoempty
agora ... irei verificando aserialize
seguirfonte
Não há nenhuma razão forte para preferir
count($myArray) == 0
maisempty($myArray)
. Eles têm semânticas idênticas. Alguns podem achar um mais legível do que o outro. Um pode ter um desempenho ligeiramente melhor do que o outro, mas não é provável que seja um fator significativo na grande maioria dos aplicativos php. Para todos os efeitos práticos, a escolha é uma questão de gosto.fonte
count
quando precisar contar, useempty
quando precisar verificar se a coleção está vazia. Claro que existem casos extremos como strings ou nulos, mas o programador precisa pensar sobre seu código. Você pode discordar, você pode.Às vezes, usar o empty é obrigatório. Por exemplo, este código:
Se você executar este código assim: http://phpfiddle.org/main/code/g9x-uwi
Você obtém esta saída:
Então, se você
count
usar a saída glob vazia, obterá uma saída errada. Você deve verificar se há vazio.Da documentação glob :
Verifique também esta pergunta: Por que contar (falso) retorna 1?
fonte
Uma vez que uma variável analisada como negativa retornaria
int(1)
comcount()
eu prefiro
($array === [] || !$array)
testar um array vazio.Sim, devemos esperar um array vazio, mas não devemos esperar uma boa implementação em funções sem tipos de retorno forçados.
Exemplos com
count()
fonte
Eu refiz minha mente, pessoal, obrigado.
Ok, não há diferença entre o uso de
empty
ecount
. Tecnicamente,count
deve ser usado para arrays eempty
pode ser usado para arrays e também para strings. Então, na maioria dos casos, eles são intercambiáveis e se você ver os documentos php, verá a lista de sugestões decount
se você está emempty
e vice-versa.fonte