É possível no PHP fazer algo assim? Como você escreveria uma função? Aqui está um exemplo. A ordem é a coisa mais importante.
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
E eu gostaria de fazer algo como
$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));
Porque no final eu uso um foreach () e eles não estão na ordem correta (porque anexo os valores a uma string que precisa estar na ordem correta e não conheço antecipadamente todas as chaves da matriz / valores).
Eu olhei através das funções de matriz interna do PHP, mas parece que você só pode classificar alfabeticamente ou numericamente.
Ai está:
fonte
array_merge()
!usort()
ouuasort()
?break
instrução assim que o valor for encontrado.array_merge()
pelo+
operador de matriz . Ele mescla por chave (também para teclas numéricas) e da esquerda para a direita , enquantoarray_merge
mescla da direita para a esquerda e nunca substitui as teclas numéricas. Por exemplo,[0,1,2]+[0,5,6,7] = [0,1,2,7]
enquantoarray_merge([0,1,2],[0,5,6,7]) = [0,1,2,0,5,6,7]
e['a' => 5] + ['a' => 7] = ['a' => 5]
masarray_merge(['a' => 5], ['a' => 7]) = ['a' => 7]
.+
sinal?Que tal esta solução
fonte
O(n * log n)
, esse algoritmo é executadoO(n^2 * log(n))
.Outra maneira para o PHP> = 5.3.0:
Resultado:
Funciona bem com string e teclas numéricas.
fonte
array_replace()
a intenção é melhor do quearray_merge()
.array_replace
também deixa o tipo de variável intacto. Se um dos valores em sua matriz tivesse sido(string) '1'
e você tivesse usado o+
operador, o valor teria sido transformado em(int) 1
array_merge()
seria apenas anexá-las?). A lógica é muito bem explicada aqui . Primeiro ,array_flip()
altera os valores da matriz $ order para chaves. Segundo ,array_replace()
substitui os valores da primeira matriz por valores com as mesmas chaves na segunda matriz. Se você precisar classificar uma matriz de acordo com as chaves de outra, nem precisará usá-laarray_flip
.fonte
Tome uma matriz como seu pedido:
Você pode classificar outra matriz com base nos valores usando o
array_intersect
Documentos :Ou, no seu caso, para classificar por chaves, use o
array_intersect_key
Documentos :Ambas as funções manterão a ordem do primeiro parâmetro e retornarão apenas os valores (ou chaves) da segunda matriz.
Portanto, para esses dois casos padrão, você não precisa escrever uma função por conta própria para realizar a classificação / reorganização.
fonte
Usei a solução do Darkwaltz4, mas usei, em
array_fill_keys
vez dearray_flip
, para preencherNULL
se uma chave não estiver definida$array
.fonte
Sem magia ...
fonte
$dataset
de nome de parâmetro jogoSe você tiver um array em seu array, precisará adaptar um pouco a função de Eran ...
fonte
Esta função retorna uma matriz sub e classificada com base no segundo parâmetro $ keys
Exemplo:
fonte
O PHP tem funções para ajudá-lo com isso:
Usort faz todo o trabalho para você e array_search fornece as chaves. array_search () retorna false quando não consegue encontrar uma correspondência para que os itens que não estão na matriz de classificação se movam naturalmente para a parte inferior da matriz.
Nota: uasort () ordenará a matriz sem afetar os relacionamentos chave => valor.
fonte
Código:
fonte
Primeira sugestão
Segunda Sugestão
Eu queria ressaltar que essas duas sugestões são incríveis. No entanto, são maçãs e laranjas. A diferença? Um é não-associativo e o outro é associativo. Se você estiver usando duas matrizes totalmente associativas, a mesclagem / inversão da matriz irá realmente mesclar e substituir a outra matriz associativa. No meu caso, esse não é o resultado que eu estava procurando. Eu usei um arquivo settings.ini para criar minha matriz de ordem de classificação. A matriz de dados que eu estava classificando não precisava ser substituída por minha contraparte de classificação associativa. Assim, a mesclagem de matriz destruiria minha matriz de dados. Ambos são ótimos métodos, ambos precisam ser arquivados em qualquer caixa de ferramentas de desenvolvedores. Com base nas suas necessidades, você pode achar que realmente precisa dos dois conceitos em seus arquivos.
fonte
Adotei a resposta do @ Darkwaltz4 por sua brevidade e gostaria de compartilhar como adaptei a solução a situações em que a matriz pode conter chaves diferentes para cada iteração, da seguinte forma:
e manteve uma "chave mestra" assim:
array_merge teria executado a mesclagem na iteração Array [1] com base em $ master_key e produzido ['some_key'] = '', um valor vazio, para essa iteração. Portanto, array_intersect_key foi usado para modificar $ master_key em cada iteração da seguinte forma:
fonte
Um pouco tarde, mas não consegui encontrar a maneira como a implementei, esta versão precisa ser fechada, php> = 5.3, mas pode ser alterada para não:
É claro que 'dontSortMe' precisa ser resolvido e pode aparecer primeiro no exemplo
fonte