Como remover o elemento Array e re-indexar a matriz?


206

Eu tenho alguns problemas com uma matriz. Eu tenho uma matriz que eu quero modificar como abaixo. Eu quero remover o elemento (elementos) dele pelo índice e, em seguida, re-indexar a matriz. É possível?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

Respostas:


456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

6
Era exatamente isso que eu queria postar, +1.
31711 Michiel Pater

4
Isso é melhor do que a solução da deceze se vários itens precisarem ser removidos de uma só vez - se os índices desses itens forem coletados previamente. Depois de usar array_splice no primeiro item, você perde os índices dos itens restantes.
Jānis Elmeris

23
Pode ser interessante notar que você pode desabilitar várias variáveis ​​/ índices de matriz em uma única chamada não configuradaunset($foo[0], $foo[3], $bar[1]);
ʙᴀᴋᴇʀ

muito agradável solução bro :)
Michael Kisilenko

Eu usei isso. Obrigado. Eu estava usando array_splicee não funcionou para os índices 0 e 1.
theGreenCabbage


29

É melhor você usar array_shift(). Isso retornará o primeiro elemento da matriz, remova-o da matriz e indexe novamente a matriz. Tudo em um método eficiente.


2
Isso é bom quando você deseja recuperar e remover o primeiro elemento da matriz, reindexando a matriz no processo. Sua função de contrapartida array_pop()recuperará e removerá o último elemento da matriz, se você precisar. Porém, nenhuma função pode ser feita para atuar em um elemento no meio da matriz.
Derrick Miller

1
Embora isso esteja relacionado ortogonalmente, a questão é explicitamente sobre qualquer elemento de uma matriz, não apenas o primeiro.
Félix Gagnon-Grenier


9
Unset($array[0]); 

Sort($array); 

Não sei por que isso está sendo rebaixado, mas se alguém se deu ao trabalho de tentar, você perceberá que funciona. O uso da classificação em uma matriz reatribui as chaves da matriz. A única desvantagem é que classifica os valores. Como as chaves serão obviamente reatribuídas, mesmo com array_values, não importa se os valores estão sendo classificados ou não.


9
mesmo que as chaves sejam reatribuídas, na resposta correta, o pedido inicial será mantido.
S3v3n

1
"Desejo remover o elemento (elementos) dele pelo índice e depois indexar novamente a matriz. É possível?" @ s3v3n O OP nunca solicitou a manutenção do pedido inicial. Simplesmente forneci uma solução que funciona e faz o que é indicado.
Frostymarvelous

1
A questão tem 2 anos. Deixe ir!
S3v3n

@ s3v3n Não é um rancor. Eu só quero saber o porquê. Obviamente, para melhorar nas respostas posteriores. Concordo que existem métodos melhores, mas existe uma razão para essa resposta ser tão ruim? É desempenho? etc? Mesmo motivo que eu estou no SO, para aprender e ensinar.
Frostymarvelous

Sob circunstâncias normais, é muito provável que o programador precise desses valores exatamente na mesma ordem que a entrada. Vamos tomar como exemplo algumas linhas do banco de dados que devem ser exibidas em uma tabela; ou um aplicativo de bate-papo em que as respostas devem estar exatamente na mesma ordem. O número de exemplos pode ser infinito, o ponto é que, na maioria dos casos, a ordem precisa ser a mesma ou pelo menos o programador esperaria a mesma ordem dos elementos na matriz.
S3v3n

4

Tente com:

$foo2 = array_slice($foo, 1);

Isso funciona apenas para o primeiro elemento e não para um elemento arbitrário.
Felix Kling

0

Além da resposta do xzyfer

A função

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

Usar

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

Resultado

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.