Alguns elementos da minha matriz são cadeias vazias com base no que o usuário enviou. Eu preciso remover esses elementos. Eu tenho isto:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
Mas isso não funciona. $linksArray
ainda possui elementos vazios. Eu também tentei fazê-lo com a empty()
função, mas o resultado é o mesmo.
Respostas:
Como você está lidando com uma série de seqüências de caracteres, você pode simplesmente usar
array_filter()
, que lida convenientemente com tudo isso para você:Lembre-se de que, se nenhum retorno de chamada for fornecido , todas as entradas da matriz iguais a
FALSE
(consulte a conversão para booleano ) serão removidas. Portanto, se você precisar preservar elementos que são'0'
, por exemplo, sequência exata , precisará de um retorno de chamada personalizado:fonte
array_filter
deve remover os elementos vazios. E se a definição de vazio do PHP não for a mesma que a sua definição, você poderá preencher a opção de retorno de chamada com uma função anônima que elimina elementos indesejados. Aparentemente, você deve ter o php 5.3 ou posterior para usar retornos de chamada anônimos. stackoverflow.com/questions/2412299/…false
elementos. ( php.net/manual/en/function.array-filter.php )a
a segunda vez apenas redefine a primeira.Você pode usar
array_filter
para remover elementos vazios:Se você tiver
(int) 0
em sua matriz, poderá usar o seguinte:EDIT: Talvez seus elementos não estejam vazios por si só, mas contenham um ou mais espaços ... Você pode usar o seguinte antes de usar
array_filter
fonte
scalar
itens em sua matriz, sim. Caso contrário, você não pode fazer isso.function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
array_map()
fiz a mágica porque eu tinha espaços nessas matrizes vazias!A resposta mais popular sobre esse tópico é absolutamente incorreta.
Considere o seguinte script PHP:
Por que é isso? Como uma sequência que contém um único caractere '0' também é avaliada como booleana false, mesmo que não seja uma sequência vazia, ela ainda será filtrada. Isso seria um bug.
Passar a função strlen interna como a função de filtragem funcionará, pois retorna um número inteiro diferente de zero para uma sequência não vazia e um número inteiro zero para uma sequência vazia. Inteiros diferentes de zero sempre avaliam como true quando convertidos em booleano, enquanto que inteiros zero sempre avaliam como false quando convertidos em booleano.
Portanto, a resposta absoluta, definitiva e correta é:
fonte
0
,""
,null
)strlen() expects parameter 1 to be string, array given
"Se nenhum retorno de chamada for fornecido, todas as entradas de entrada iguais a FALSE serão removidas." - http://php.net/manual/en/function.array-filter.php
fonte
fonte
Você pode apenas fazer
array_filter: "Se nenhum retorno de chamada for fornecido, todas as entradas de entrada iguais a FALSE serão removidas." Isso significa que os elementos com valores NULL, 0, '0', '', FALSE, array () também serão removidos.
A outra opção está fazendo
que removerá elementos com valores NULL '' e FALSE.
Espero que isto ajude :)
ATUALIZAR
Aqui está um exemplo.
Resumindo:
fonte
fonte
false
e0
. Considerando que isso foi postado no mesmo minuto que a resposta aceita (que é insegura e incorreta), só posso supor que seus 8 upvotes em comparação com os 649 da resposta aceita se devam à solução de uma linha.array_filter()
seria uma abordagem mais limpo do que umforeach()
ciclotrim()
, eu recomendariaif(is_string($link) && trim($link) === '')
Outro liner para remover elementos vazios ("" string vazia) do seu array.
Nota: Este código deliberadamente mantém
null
,0
efalse
elementos.Ou talvez você queira aparar os elementos da matriz primeiro:
Nota: Este código também remove
null
efalse
elementos.fonte
Em resumo:
Este é o meu código sugerido:
Explicação:
Eu acho que o uso
array_filter
é bom, mas não o suficiente, porque os valores são iguaisspace
e\n
, ... mantêm-se na matriz e isso geralmente é ruim.Então eu sugiro que você use mistura
array_filter
earray_map
.array_map
é para aparar,array_filter
é para remover valores vazios,strlen
é para manter o0
valor earray_values
é para indexar novamente, se necessário.Amostras:
Resultados:
Teste on-line:
http://phpio.net/s/5yg0
fonte
Se você estiver trabalhando com uma matriz numérica e precisar reindexá -la após remover elementos vazios, use a função array_values :
Veja também: PHP reindex array?
fonte
A resposta mais votada está errada ou, pelo menos, não é completamente verdadeira, pois o OP está falando apenas de strings em branco. Aqui está uma explicação completa:
O que significa vazio ?
Antes de tudo, devemos concordar com o que significa vazio . Você quer filtrar:
$element === false
)empty()
função do PHP ?Como você filtra os valores
Para filtrar apenas cadeias vazias :
Para filtrar apenas valores estritamente falsos , você deve usar uma função de retorno de chamada :
O retorno de chamada também é útil para qualquer combinação na qual você deseja filtrar os valores "falsey", exceto alguns. (Por exemplo, filtre todos
null
efalse
etc, deixando apenas0
):O terceiro e o quarto casos são (finalmente para nossos propósitos) equivalentes e, para isso, tudo o que você precisa usar é o padrão:
fonte
null
efalse
, mas deixar 0, também pode usar a função interna do phpstrlen
como retorno de chamada.Eu tive que fazer isso para manter um valor de matriz de (string) 0
fonte
fonte
Para matriz multidimensional
fonte
fonte
fonte
Eu uso o seguinte script para remover elementos vazios de uma matriz
fonte
Só quero contribuir com uma alternativa para loops ... também abordando lacunas nas chaves ...
No meu caso, eu queria manter as chaves sequenciais da matriz quando a operação estivesse concluída (não apenas números ímpares, que era o que eu estava olhando. Configurar código para procurar apenas chaves ímpares parecia frágil para mim e não favorável ao futuro).
Eu estava procurando por algo mais parecido com isto: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
A combinação de array_filter e array_slice faz o truque.
$example = array_filter($example); $example = array_slice($example,0);
Não faço ideia de eficiência ou benchmarks, mas funciona.
fonte
resultado
fonte
fonte
Apenas uma linha: atualização (graças a @suther):
fonte
use a
array_filter
função para remover valores vazios:fonte
Remover elementos vazios da matriz
funciona!
fonte
De acordo com o seu método, você pode capturar esses elementos em outra matriz e usar o seguinte,
fonte
tente isso ** ** Exemplo
fonte
Eu acho que array_walk é muito mais adequado aqui
Resultado:
Também aparamos espaços vazios a partir dos valores válidos
Por fim, apenas (null), (Boolean False) e ('') serão considerados strings vazias
Não há
False
problema em removê-lo, porque o AFAIK não pode enviar valores booleanos.fonte
Com esses tipos de coisas, é muito melhor ser explícito sobre o que você deseja ou não.
Isso ajudará o próximo cara a não ser pego de surpresa com o comportamento de
array_filter()
sem retorno de chamada. Por exemplo, acabei com essa pergunta porque esqueci searray_filter()
removeNULL
ou não. Perdi tempo quando poderia ter usado a solução abaixo e tive a minha resposta.Além disso, a lógica é angnóstica de linguagem, no sentido de que o código pode ser copiado para outra linguagem sem ter que entender o comportamento de uma função php como
array_filter
quando nenhum retorno de chamada é passado.Na minha solução, é claro à primeira vista o que está acontecendo. Remova uma condicional para manter algo ou adicione uma nova condição para filtrar valores adicionais.
Desconsidere o uso real,
array_filter()
já que estou apenas transmitindo um retorno de chamada personalizado - você pode prosseguir e extrair isso para sua própria função, se desejar. Estou apenas usando-o como açúcar para umforeach
loop.Outro benefício dessa abordagem é que você pode separar os predicados de filtragem em uma função abstrata que filtra um único valor por matriz e cria uma solução compostável.
Veja este exemplo e os comentários embutidos para a saída.
Agora você pode criar dinamicamente uma função chamada
filterer()
usingpipe()
que aplicará essas funções parcialmente aplicadas a você.fonte