array_filter($array, $callback) retorna os elementos de $array para os quais $callback retorna true (ou qualquer valor que vira true). O array vem primeiro, o callback depois, e os elementos que ficam mantêm as chaves originais.
As chaves no resultado são 1, 3, 5, 7: as posições que esses valores tinham no array original. Esse detalhe importa mais do que parece, e a seção depois da próxima mostra como lidar com ele.
Remover valores vazios de um array
Chame array_filter sem callback e ele remove todo valor que vira false: strings vazias, null, false, 0, "0" e arrays vazios. É o jeito mais rápido de limpar as partes de um explode() ou uma lista de campos de formulário.
O primeiro resultado também perdeu "0" e 0, que muitas vezes são dados reais (uma quantidade zero, um dígito de CEP). Quando zero é uma resposta válida, escreva o callback você mesmo, como na segunda chamada. A página sobre empty tem a lista completa de valores que o PHP trata como vazios.
Reindexar o resultado com array_values
Como as chaves são mantidas, uma lista filtrada pode ter buracos. Um laço for a partir de 0 então encontra chaves ausentes, e o json_encode transforma o resultado num objeto JSON em vez de um array. O array_values() renumera.
Filtrar por chave com ARRAY_FILTER_USE_KEY
O terceiro argumento escolhe o que o callback recebe. ARRAY_FILTER_USE_KEY passa só a chave. ARRAY_FILTER_USE_BOTH passa o valor e depois a chave.
Para manter um conjunto fixo de chaves que você já conhece, array_intersect_key($config, array_flip(['db_host', 'db_port'])) faz o mesmo sem callback.
Filtrar um array multidimensional
A maioria dos dados reais é uma lista de linhas. O callback recebe uma linha por vez, então você testa o campo que precisar.
Mude $maxPrice e rode de novo. Para pegar só os nomes depois, passe o resultado para o array_column: array_column($affordable, 'name').
Filtrar, depois mapear, depois reduzir
O array_filter escolhe elementos, o array_map os altera, e o array_reduce condensa o array num único valor. array_reduce($array, $callback, $initial) chama o callback com o total acumulado e o próximo elemento.
Para uma soma simples, array_sum($totals) é mais curto. O array_reduce se justifica quando o resultado é outra coisa: uma string, uma contagem por grupo, a maior linha.
Erro comum: alterar valores dentro do array_filter
O valor de retorno do callback só decide se um elemento fica. Qualquer outra coisa que ele calcule é descartada, então este código não aplica trim em nada:
Transforme com array_map, depois filtre, e adicione array_values quando precisar de uma lista limpa.
Perguntas frequentes
Como removo valores vazios de um array no PHP?
Chame array_filter($array) sem callback: ele descarta todo valor falso ("", null, false, 0, "0", []). Para descartar só strings vazias e null mas manter 0, passe um callback: array_filter($array, fn($v) => $v !== '' && $v !== null).
Por que o array_filter mantém as chaves antigas?
O array_filter nunca renumera: os elementos que ele mantém ficam sob as chaves originais, então uma lista pode voltar como [0 => 'a', 2 => 'c']. Envolva em array_values() para ter 0, 1, 2 de novo, o que também faz o json_encode gerar um array JSON em vez de um objeto.
Como filtro um array por chave no PHP?
Passe ARRAY_FILTER_USE_KEY como terceiro argumento, e o callback recebe a chave em vez do valor: array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY). Use ARRAY_FILTER_USE_BOTH para receber o valor e a chave.
Qual a diferença entre array_filter e array_map?
O array_filter decide quais elementos ficam e os retorna sem alteração. O array_map altera cada elemento e retorna a mesma quantidade de elementos. Para fazer os dois, encadeie: array_map('strtoupper', array_filter($arr)).