PHP Básico

array_filter no PHP apaga o 0 junto: como filtrar só o que é vazio

Você monta um array de quantidades, roda array_filter($valores) pra tirar os campos vazios e percebe que a quantidade 0 sumiu junto. Não é bug do PHP 8.3: sem callback, o array_filter descarta tudo que é falsy — o 0, o 0.0, a string '0', a string vazia, o null, o false e o array vazio.

Diga no callback o que é vazio pra você

O segundo argumento resolve em uma linha. Na maioria dos casos eu quero derrubar só null e string vazia, mantendo o zero:

$valores = [10, 0, '', null, '0', 5, false];

$limpo = array_filter($valores, fn($v) => $v !== null && $v !== '');
// sobram 10, 0, '0', 5 e false

// se o false também tiver que sair:
$limpo = array_filter($valores, fn($v) => $v !== null && $v !== '' && $v !== false);

A versão sem callback só converte cada item pra booleano, e em PHP zero é falso. Por isso somem sempre os mesmos campos: quantidade, saldo, desconto, nota — os que valem 0 com frequência.

USE_BOTH e as chaves que ficam com buraco

Quando o critério depende do nome do campo, passe a flag ARRAY_FILTER_USE_BOTH e receba valor e chave, nessa ordem:

$campos = ['nome' => 'Roger', 'qtd' => 0, '_token' => 'abc', 'obs' => ''];

$limpo = array_filter(
    $campos,
    fn($v, $k) => $v !== '' && !str_starts_with($k, '_'),
    ARRAY_FILTER_USE_BOTH
);
// ['nome' => 'Roger', 'qtd' => 0]

Última pegadinha: o array_filter preserva as chaves originais. Num array de lista isso deixa índices 0, 2, 5 e o json_encode passa a devolver um objeto em vez de um array. Se a saída vira JSON, envolva em array_values() antes de responder.

Post Recentes

Criar cupom no WooCommerce por código: WC_Coupon com validade e limite

Função pronta para gerar um cupom único por cliente depois do pedido concluído, com WC_Coupon, data de expiração, limite de…

11 horas atrás

Modifier de produto no Magento 2: campo novo no form sem sobrescrever XML

Como registrar um modifier no pool do formulário de produto do Magento 2 e criar um campo próprio na aba,…

1 dia atrás

Tela branca no WordPress 6.9: como achar o erro com PHP 8.3

Site abrindo em branco sem mensagem nenhuma? Leia o log do PHP-FPM, identifique o plugin que causou o fatal e…

2 dias atrás

DateTimeImmutable modify: por que a data não muda no PHP 8.3

Trocou DateTime por DateTimeImmutable e a data parou de andar? O modify devolve uma cópia nova em vez de alterar…

3 dias atrás

Defer nos scripts do WordPress 6.9 sem plugin, com wp_enqueue_script

Use o parâmetro strategy do wp_enqueue_script para adiar o JavaScript do tema, sem plugin de otimização, e entenda por que…

4 dias atrás

Banner de cookie que bloqueia de verdade: script só carrega depois do aceite

O banner aparece, o visitante não clica em nada e o Analytics já gravou cookie. Veja como segurar o script…

4 dias atrás