Algumas respostas decentes, mas pensei em expandir um pouco para explicar mais claramente quando o PHP determinar se um array está vazio.
Notas principais:
Uma matriz com uma chave (ou chaves) será determinada como NÃO vazia pelo PHP.
Como os valores da matriz precisam de chaves para existir, ter valores ou não em uma matriz não determina se está vazio, apenas se não houver chaves (E, portanto, sem valores).
Portanto, verificar um array com empty()
simplesmente não informa se você tem valores ou não, ele informa se o array está vazio e as chaves fazem parte de um array.
Portanto, considere como você está produzindo sua matriz antes de decidir qual método de verificação usar.
EG Uma matriz terá chaves quando um usuário enviar seu formulário HTML quando cada campo de formulário tiver um nome de matriz (ou seja name="array[]"
).
Uma matriz não vazia será produzida para cada campo, pois haverá valores de chave incrementados automaticamente para a matriz de cada campo de formulário.
Veja estas matrizes, por exemplo:
/* Assigning some arrays */
// Array with user defined key and value
$ArrayOne = array("UserKeyA" => "UserValueA", "UserKeyB" => "UserValueB");
// Array with auto increment key and user defined value
// as a form field would return with user input
$ArrayTwo[] = "UserValue01";
$ArrayTwo[] = "UserValue02";
// Array with auto incremented key and no value
// as a form field would return without user input
$ArrayThree[] = '';
$ArrayThree[] = '';
Se você repetir as chaves e os valores das matrizes acima, obtém o seguinte:
ARRAY ONE:
[UserKeyA] => [UserValueA]
[UserKeyB] => [UserValueB]
ARRAY DOIS:
[0] => [UserValue01]
[1] => [UserValue02]
ARRAY TRÊS:
[0] => []
[1] => []
E testar as matrizes acima com empty()
retorna os seguintes resultados:
ARRAY ONE:
$ ArrayOne não está vazio
ARRAY
DOWO : $ ArrayTwo não está vazio
ARRAY THREE:
$ ArrayThree não está vazio
Uma matriz sempre estará vazia quando você atribui uma matriz, mas não a usa posteriormente, como:
$ArrayFour = array();
Isso ficará vazio, ou seja, o PHP retornará TRUE quando usado se estiver empty()
acima.
Portanto, se a sua matriz tiver chaves - seja por exemplo, os nomes de entrada de um formulário ou se você as atribuir manualmente (por exemplo, crie uma matriz com os nomes das colunas do banco de dados como as chaves, mas sem valores / dados do banco de dados), a matriz NÃO será empty()
.
Nesse caso, você pode fazer um loop na matriz em um foreach, testando se cada chave possui um valor. Esse é um bom método se você precisar executar a matriz de qualquer maneira, talvez verificando as chaves ou limpando os dados.
No entanto, não é o melhor método se você simplesmente precisar "se os valores existirem" retorna VERDADEIRO ou FALSO . Existem vários métodos para determinar se uma matriz possui algum valor quando sabe que terá chaves. Uma função ou classe pode ser a melhor abordagem, mas, como sempre, depende do seu ambiente e dos requisitos exatos, além de outras coisas, como o que você faz atualmente com a matriz (se houver).
Aqui está uma abordagem que usa muito pouco código para verificar se uma matriz possui valores:
Usando array_filter()
:
itera sobre cada valor na matriz, passando-os para a função de retorno de chamada. Se a função de retorno de chamada retornar true, o valor atual da matriz será retornado para a matriz de resultados. As chaves da matriz são preservadas.
$EmptyTestArray = array_filter($ArrayOne);
if (!empty($EmptyTestArray))
{
// do some tests on the values in $ArrayOne
}
else
{
// Likely not to need an else,
// but could return message to user "you entered nothing" etc etc
}
A execução array_filter()
nas três matrizes de exemplo (criadas no primeiro bloco de código nesta resposta) resulta no seguinte:
ARRAY ONE:
$ arrayone não está vazio
ARRAY DOIS:
$ arraytwo não está vazio
ARRAY TRÊS:
$ arraythree está vazio
Portanto, quando não há valores, sejam chaves ou não, use array_filter()
para criar uma nova matriz e verifique se a nova matriz está vazia mostra se havia algum valor na matriz original.
Não é o ideal e é um pouco confuso, mas se você tem uma matriz enorme e não precisa fazer uma repetição por qualquer outro motivo, esse é o mais simples em termos de código necessário.
Não tenho experiência em verificar despesas gerais, mas seria bom saber as diferenças entre usar array_filter()
e foreach
verificar se um valor foi encontrado.
Obviamente, o benchmark precisaria estar em vários parâmetros, em matrizes pequenas e grandes e quando houver valores e não etc.