Eu tenho a seguinte matriz, que eu gostaria de reindexar para que as chaves sejam revertidas (idealmente começando em 1):
Matriz atual ( edit: a matriz realmente se parece com isso):
Array (
[2] => Object
(
[title] => Section
[linked] => 1
)
[1] => Object
(
[title] => Sub-Section
[linked] => 1
)
[0] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)
)
Como deve ser:
Array (
[1] => Object
(
[title] => Section
[linked] => 1
)
[2] => Object
(
[title] => Sub-Section
[linked] => 1
)
[3] => Object
(
[title] => Sub-Sub-Section
[linked] =>
)
)
Respostas:
Se você deseja voltar a indexar o zero, basta fazer o seguinte:
Se você precisar iniciar um, use o seguinte:
Aqui estão as páginas de manual para as funções usadas:
array_values()
array_combine()
range()
fonte
array_values
retorna uma cópia da matriz. Portanto, se você tiver referências à matriz,array_splice
seria melhor. Veja a solução @imagiro.array_values()
fazê-la funcionar, se você começar com índice 0 o tempo todo.Aqui está a melhor maneira :
que retorna
fazendo isso
você entende isso
Explicação
array_values()
: Retorna os valores da matriz de entrada e os índices numericamente.array_filter()
: Filtra os elementos de uma matriz com uma função definida pelo usuário (UDF Se nenhuma for fornecida , todas as entradas na tabela de entrada com o valor de FALSE serão excluídas .)fonte
array_filter()
parece completamente irrelevante para os dados da amostra.Acabei de descobrir que você também pode fazer uma
Isso faz a reindexação no local, para que você não termine com uma cópia da matriz original.
fonte
Por que reindexar? Basta adicionar 1 ao índice:
Editar Depois que a pergunta for esclarecida: Você pode usar o
array_values
para redefinir o índice iniciando em 0. Em seguida, você pode usar o algoritmo acima se desejar que os elementos impressos comecem em 1.fonte
Bem, eu gostaria de pensar que, para qualquer que seja seu objetivo final, você não precisaria modificar a matriz para ser baseada em 1 e não em 0, mas poderia lidar com isso no momento da iteração, como o Gumbo postou.
No entanto , para responder sua pergunta, essa função deve converter qualquer matriz em uma versão baseada em 1
EDITAR
Aqui está uma função mais reutilizável / flexível, se você desejar
fonte
Isso fará o que você deseja:
fonte
Você pode considerar por que deseja usar uma matriz baseada em 1. Matrizes baseadas em zero (ao usar matrizes não associativas) são bastante padrão e, se você deseja gerar uma saída para uma interface do usuário, a maioria lidaria com a solução apenas aumentando o número inteiro na saída da interface do usuário.
Pense na consistência - tanto no aplicativo quanto no código com o qual trabalha - ao pensar nos indexadores baseados em 1 para matrizes.
fonte
Uma solução mais elegante:
fonte
Você pode reindexar uma matriz para que a nova matriz comece com um índice de 1 como este;
A saída acima é;
fonte
array_values
aqui. Veja minha resposta.Semelhante ao @monowerker, eu precisava reindexar uma matriz usando a chave de um objeto ...
Isso resultou em:
fonte
fonte
Se você não está tentando reordenar a matriz, basta:
$ array = array_reverse ($ array);
$ array = array_reverse ($ array);
O array_reverse é muito rápido e é reordenado à medida que se inverte. Alguém me mostrou isso há muito tempo. Portanto, não posso receber crédito por ter vindo com isso. Mas é muito simples e rápido.
fonte
Semelhante à contribuição de Nick, cheguei à mesma solução para reindexar uma matriz, mas aprimorei a função um pouco desde a versão 5.4 do PHP, que não funciona devido à passagem de variáveis por referência. Exemplo de função de reindexação é assim usando o
use
fechamento de palavras-chave:fonte
Aqui está minha própria implementação. As chaves na matriz de entrada serão renumeradas com o incremento de chaves a partir de $ start_index.
fonte
Simplesmente faça o seguinte:
fonte
Você pode fazer isso facilmente depois de usar as funções array_values () e array_filter () juntas para remover os elementos vazios da matriz e reindexá-la de uma matriz no PHP.
Função array_filter () A função PHP array_filter () remove elementos ou valores vazios da matriz de uma matriz no PHP. Isso também removerá valores em branco, nulos, falsos, 0 (zero).
Função array_values () A função PHP array_values () retorna uma matriz contendo todos os valores de uma matriz. A matriz retornada terá teclas numéricas, iniciando em 0 e aumentando em 1.
Remover elementos vazios da matriz e reindexar
Primeiro vamos ver a saída do array $ stack:
Resultado:
Na saída acima, queremos remover valores em branco, nulos, 0 (zero) e, em seguida, reindexar os elementos da matriz. Agora vamos usar as funções array_values () e array_filter () juntas, como no exemplo abaixo:
Resultado:
fonte
array_filter()
parece completamente irrelevante para os dados da amostra do OP.Remoção duplicada e reindexar uma matriz:
fonte
array_filter()
parece completamente irrelevante para os dados da amostra do OP.A maneira mais rápida que consigo pensar
E se você quiser apenas reindexar a matriz (comece em zero) e tiver o PHP +7.3, poderá fazê-lo desta maneira
Eu acredito que
array_unshift
é melhor do quearray_values
como o primeiro não cria uma cópia da matriz.fonte
Parece que todas as
array_combine()
respostas estão copiando o mesmo "erro" (a chamada desnecessária dearray_values()
).array_combine()
ignora as chaves dos dois parâmetros que recebe.Código: ( Demo )
Resultado:
fonte
A ordenação é apenas uma ordenação () , a reindexação parece um pouco boba, mas se for necessário, isso será feito. Embora não esteja no local. Use array_walk () se você fizer isso em vários lugares, apenas use um loop for-key-value se esta for uma operação única.
fonte
Se não há problema em criar uma nova matriz, é o seguinte:
Se você precisar de reversão no local, precisará executar um retrocesso para não pisar nos índices necessários:
fonte
array_values()
para obter uma matriz baseada em 0 e, em seguida, fazer alguns ajustes nesse resultado, se uma matriz baseada em 1 for realmente necessária.