Depois de array_filter(), como posso repor as chaves para entrar na ordem numérica, começando em 0

StackOverflow https://stackoverflow.com/questions/3401850

  •  25-09-2019
  •  | 
  •  

Pergunta

Eu usei apenas array_filter para remover entradas que tinha apenas o valor de " a partir de uma matriz, e agora eu quero aplicar certas transformações sobre ele, dependendo do marcador de posição a partir de 0, mas, infelizmente, ele ainda mantém o índice original.Me olhou por um tempo e não conseguia ver nada, talvez eu só faltou o óbvio, mas a minha pergunta é...

Como posso facilmente repor os índices da matriz para começar a 0 e vá em ordem na NOVA matriz, ao invés de ter que manter velho índices?

Foi útil?

Solução

Se você ligar array_values Em sua matriz, ela será reindexada de zero.

Outras dicas

Se você estiver usando o filtro de matriz, faça o seguinte

$NewArray = array_values(array_filter($OldArray));

Usar array_values():

<?php

$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
    return $var !== 'bar';
});

print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1

Eu me preocupo sobre como muitos programadores têm inocentemente copiar/colar o array_values(array_filter()) método em seus códigos - Eu me pergunto como muitos programadores que, involuntariamente, enfrentou problemas por causa da array_filter da ganância.Ou pior, quantas pessoas nunca descobriu que a função elimina muitos valores da matriz...

Vou apresentar uma alternativa melhor para as duas partes do processo de stripping NULL elementos de uma matriz e re-indexação de chaves.

No entanto, em primeiro lugar, é extremamente importante que eu estresse gananciosos natureza de array_filter() e como isso pode silenciosamente monkeywrench seu projeto.Aqui é uma matriz com valores mistos em que ela vai expor o problema:

$array=['foo',NULL,'bar',0,false,null,'0',''];

Valores nulos serão removidos independentemente de letras maiúsculas/minúsculas.

Mas olha o que permanece na matriz quando usamos array_values() & array_filter():

array_values(array_filter($array));

Matriz de saída ($array):

array (
  0 => 'foo',
  1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!

Agora veja o que você ganha com o meu método que utiliza array_walk() & is_null() para gerar uma nova matriz filtrada:

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});

Isso pode ser escrito em várias linhas para facilitar a leitura/explicando:

array_walk(                      // iterate each element of an input array
    $array,                      // this is the input array
    function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
        if(!is_null($v)){        // this literally checks for null values
            $filtered[]=$v;      // value is pushed into output with new indexes
        }
    }
);

Matriz de saída ($filter):

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)

Com o meu método você obter o seu re-indexados chaves, todos os valores não nulos, e de nenhum dos valores nulos.Limpo, portátil e confiável de um forro para todos os de sua matriz nula necessidades de filtragem.Aqui é um demonstração.



Da mesma forma, se você deseja remover o vazio, falso e nulo elementos (retenção zeros), esses quatro métodos de trabalho será de:

var_export(array_values(array_diff($array,[''])));

ou

var_export(array_values(array_diff($array,[null])));

ou

var_export(array_values(array_diff($array,[false])));

ou

var_export(array_values(array_filter($array,'strlen')));

Saída:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => '0',
)

Finalmente, para quem prefere a sintaxe das construções de linguagem, você também pode apenas empurrar qualificação valores em uma nova matriz para a emissão de novos índices.

$array=['foo', NULL, 'bar', 0, false, null, '0', ''];

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top