Acabei de usar array_filter para remover entradas que tinham apenas o valor '' de uma matriz e agora quero aplicar certas transformações dependendo do marcador começando em 0, mas infelizmente ainda mantém o índice original. Eu olhei por um tempo e não consegui ver nada, talvez eu só tenha perdido o óbvio, mas minha pergunta é ...
Como posso redefinir facilmente os índices da matriz para começar em 0 e ir em ordem na nova matriz, em vez de manter os índices antigos?
array_filter()
- você pode purgar mais do que pretende. Aqui está uma explicação com uma demonstração: stackoverflow.com/a/43657056/2943403Respostas:
Se você chamar
array_values
seu array, ele será reindexado do zero.fonte
Se você estiver usando o filtro Array, faça o seguinte
fonte
Eu me preocupo com quantos programadores inocentemente copiaram / colaram o
array_values(array_filter())
método em seus códigos - eu me pergunto quantos programadores inconscientemente tiveram problemas por causa da ganância de array_filter. Ou pior, quantas pessoas nunca descobriram que a função elimina muitos valores da matriz ...Apresentarei uma alternativa melhor para o processo de duas partes de remoção de
NULL
elementos de uma matriz e reindexação das chaves.No entanto, em primeiro lugar, é extremamente importante enfatizar a natureza gananciosa
array_filter()
e como isso pode perturbar silenciosamente seu projeto. Aqui está uma matriz com valores mistos que irá expor o problema:Os valores nulos serão removidos independentemente de maiúsculas / minúsculas.
Mas veja o que permanece na matriz quando usamos array_values () & array_filter () :
Matriz de saída ($ array):
Agora veja o que você obtém com meu método que usa array_walk () & is_null () para gerar uma nova matriz filtrada:
Isso pode ser escrito em várias linhas para facilitar a leitura / explicação:
Matriz de saída ($ filter):
Com meu método, você obtém suas chaves reindexadas, todos os valores não nulos e nenhum dos valores nulos. Um liner limpo, portátil e confiável para todas as suas necessidades de filtragem de nulos de array. Aqui está uma demonstração .
Da mesma forma, se você deseja remover elementos vazios, falsos e nulos (retendo zeros), estes quatro métodos funcionarão:
ou
ou
ou
Resultado:
Finalmente, para quem prefere a sintaxe de construções de linguagem, você também pode simplesmente inserir valores de qualificação em uma nova matriz para emitir novos índices.
fonte
array_values(array_filter($arr, function($el) {return $el !== '';}))
? Essa parece ser a maneira natural de fazer o que o OP está pedindo.array_filter()
menos que seu conhecimento íntimo dos dados permita uma filtragem gananciosa sem efeitos colaterais. (Um outro aviso:empty()
se comporta da mesma maneira e também inclui uma matriz vazia em sua ganância.)array_filter()
se comporta exatamente como você espera com base no que diz no manual: php.net/manual/en/function.array-filter.php "Se nenhum retorno de chamada for fornecido, todas as entradas do array são iguais a FALSE (consulte convertendo para booleano ) será removido." E deve ser do conhecimento comum entre os programadores de PHP que 0, null, false, '' e '0' são avaliados como falsos quando coagidos para booleanos.Use
array_values()
:fonte