Eu tenho uma matriz associativa no formulário em key => value
que chave é um valor numérico, no entanto, não é um valor numérico seqüencial. A chave é realmente um número de identificação e o valor é uma contagem. Isso é bom para a maioria dos casos, no entanto, quero uma função que obtenha o nome legível por humanos da matriz e use-o para a chave, sem alterar o valor.
Eu não vi uma função que faz isso, mas estou assumindo que preciso fornecer a chave antiga e a nova chave (ambas as quais tenho) e transformar a matriz. Existe uma maneira eficiente de fazer isso?
php
arrays
associative-array
Thomas Owens
fonte
fonte
Respostas:
fonte
A maneira como você faria isso e preservaria a ordem da matriz é colocando as chaves da matriz em uma matriz separada, localize e substitua a chave nessa matriz e combine-a novamente com os valores.
Aqui está uma função que faz exatamente isso:
fonte
se o seu
array
for construído a partir de uma consulta ao banco de dados, você poderá alterar a chave diretamente damysql
instrução:ao invés de
use algo como:
fonte
A resposta do KernelM é boa, mas para evitar o problema levantado por Greg no comentário (chaves conflitantes), o uso de uma nova matriz seria mais seguro
fonte
Você pode usar uma segunda matriz associativa que mapeia nomes legíveis por humanos para os IDs. Isso também forneceria um relacionamento Muitos para 1. Então faça algo parecido com isto:
fonte
Se você também deseja que a posição da nova chave de matriz seja a mesma que a antiga, você pode fazer isso:
fonte
Se sua matriz é recursiva, você pode usar esta função: teste estes dados:
aqui está a função:
fonte
fonte
Eu gosto da solução do KernelM, mas precisava de algo que lidasse com possíveis conflitos de chave (onde uma nova chave pode corresponder a uma chave existente). Aqui está o que eu vim com:
Você pode então percorrer uma matriz como esta:
fonte
Aqui está uma função auxiliar para conseguir isso:
bastante baseado na resposta do @KernelM .
Uso:
Retornará true ao renomear com êxito, caso contrário, false .
fonte
Coisas fáceis:
esta função aceitará o destino $ hash e $ substitutions também é um hash que contém associações newkey => oldkey .
Essa função preserva a ordem original , mas pode ser problemática para matrizes muito grandes (como acima de 10k) em relação ao desempenho e à memória .
essa função alternativa faria o mesmo, com desempenho e uso de memória muito melhores , com o custo de perder a ordem original (o que não deve ser um problema, pois é hashtable!)
fonte
esse código ajudará a mudar a chave antiga para a nova
exibir como
fonte
Comparação simples de benchmark de ambas as soluções.
Solução 1 Copie e remova (pedido perdido) https://stackoverflow.com/a/240676/1617857
Solução 2 Renomeie a chave https://stackoverflow.com/a/21299719/1617857
Resultados:
fonte
Você pode usar esta função com base em array_walk:
Dá:
fonte
isso funciona para renomear a primeira chave:
Em seguida, print_r ($ a) renderiza uma matriz em ordem reparada:
isso funciona para renomear uma chave arbitrária:
print_r ($ a)
uma função generalizada:
fonte
Se você deseja substituir várias chaves ao mesmo tempo (preservando a ordem):
Uso:
fonte
Existe uma maneira alternativa de alterar a chave de um elemento da matriz ao trabalhar com uma matriz completa - sem alterar a ordem da matriz. É simplesmente copiar a matriz para uma nova matriz.
Por exemplo, eu estava trabalhando com uma matriz multidimensional e multidimensional que continha chaves associativas e indexadas - e queria substituir as chaves inteiras por seus valores, sem quebrar a ordem.
Eu fiz isso alternando chave / valor para todas as entradas numéricas da matriz - aqui: ['0' => 'foo']. Observe que o pedido está intacto.
Resultado:
fonte
A melhor maneira é usar a referência e não usar a configuração (o que faz outra etapa para limpar a memória)
solução:
você tem um original e uma referência com novo nome.
ou se você não quiser ter dois nomes em um valor é bom, crie outra guia e foreach na referência
A Iterration é melhor nas chaves do que clonar toda a matriz e limpar a matriz antiga se você tiver dados longos, como 100 linhas +++ etc.
fonte
Hmm, não testei antes, mas acho que esse código está funcionando
fonte
Um que preserva a ordenação simples de entender:
fonte
Você pode escrever uma função simples que aplica o retorno de chamada às chaves da matriz especificada. Semelhante ao array_map
Aqui está uma lista https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php .
fonte
Essa função renomeará uma chave de matriz, mantendo sua posição, combinando com a pesquisa de índice.
Uso:
fonte
Essa função básica lida com a troca de chaves da matriz e a manutenção da ordem na ordem original ...
Você poderia fazer um loop e trocar todas as chaves 'a' por 'z', por exemplo ...
fonte