Est-il possible en PHP de faire quelque chose comme ça? Comment feriez-vous pour écrire une fonction? Voici un exemple. L'ordre est la chose la plus importante.
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
Et j'aimerais faire quelque chose comme
$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));
Parce qu'à la fin j'utilise un foreach () et ils ne sont pas dans le bon ordre (car j'ajoute les valeurs à une chaîne qui doit être dans le bon ordre et je ne connais pas à l'avance toutes les clés du tableau / valeurs).
J'ai parcouru les fonctions de tableau interne de PHP, mais il semble que vous ne pouvez trier que par ordre alphabétique ou numérique.
Voilà:
la source
array_merge()
!usort()
ouuasort()
?break
instruction une fois que la valeur a été trouvée.array_merge()
par l'+
opérateur de tableau . Il fusionne par clé (également pour les touches numériques) et de gauche à droite , tandis quearray_merge
fusionne de droite à gauche et n'écrase jamais les touches numériques. Par exemple,[0,1,2]+[0,5,6,7] = [0,1,2,7]
pendantarray_merge([0,1,2],[0,5,6,7]) = [0,1,2,0,5,6,7]
et['a' => 5] + ['a' => 7] = ['a' => 5]
maisarray_merge(['a' => 5], ['a' => 7]) = ['a' => 7]
.+
signe?Que diriez-vous de cette solution
la source
O(n * log n)
, alors cet algorithme s'exécuteO(n^2 * log(n))
.Une autre façon pour PHP> = 5.3.0:
Résultat:
Fonctionne très bien avec les touches de chaîne et numériques.
la source
array_replace()
qu'il était préférable de transmettre l'intentionarray_merge()
.array_replace
laisse également le type de variable intact. Si l'une des valeurs de votre tableau aurait été(string) '1'
et que vous auriez utilisé l'+
opérateur, la valeur aurait été transformée en(int) 1
array_merge()
ajouteraient-elles simplement?). La logique est très bien expliquée ici . Tout d'abord ,array_flip()
change les valeurs du tableau $ order en clés. Deuxièmement ,array_replace()
remplace les valeurs du premier tableau par des valeurs ayant les mêmes clés dans le deuxième tableau. Si vous devez trier un tableau en fonction des clés d'un autre, vous n'avez même pas à utiliserarray_flip
.la source
Prenez un tableau comme votre commande:
Vous pouvez trier un autre tableau en fonction des valeurs à l'aide de
array_intersect
Docs :Ou dans votre cas, pour trier par clés, utilisez
array_intersect_key
Docs :Les deux fonctions conserveront l'ordre du premier paramètre et ne renverront que les valeurs (ou clés) du second tableau.
Donc, pour ces deux cas standards, vous n'avez pas besoin d'écrire une fonction vous-même pour effectuer le tri / réarrangement.
la source
J'ai utilisé la solution de Darkwaltz4 mais utilisé à la
array_fill_keys
place dearray_flip
, pour remplirNULL
si une clé n'est pas définie$array
.la source
Sans magie ...
la source
$dataset
à jour pour correspondre au nom du paramètreSI vous avez un tableau dans votre tableau, vous devrez adapter un peu la fonction d'Eran ...
la source
Cette fonction renvoie un sous-tableau trié basé sur le deuxième paramètre $ keys
Exemple:
la source
PHP a des fonctions pour vous aider:
Usort fait tout le travail pour vous et array_search fournit les clés. array_search () renvoie false quand il ne trouve pas de correspondance, donc les éléments qui ne sont pas dans le tableau de tri se déplacent naturellement vers le bas du tableau.
Remarque: uasort () ordonnera le tableau sans affecter les relations clé => valeur.
la source
Code:
la source
Première suggestion
Deuxième suggestion
Je voulais souligner que ces deux suggestions sont géniales. Cependant, ce sont des pommes et des oranges. La différence? L'un est convivial non associatif et l'autre est convivial associatif. Si vous utilisez 2 tableaux entièrement associatifs, le tableau fusion / retournement fusionnera et écrasera en fait l'autre tableau associatif. Dans mon cas, ce ne sont pas les résultats que je recherchais. J'ai utilisé un fichier settings.ini pour créer mon tableau d'ordre de tri. Le tableau de données que je triais n'avait pas besoin d'être écrasé par mon homologue de tri associatif. Ainsi, la fusion de tableaux détruirait mon tableau de données. Les deux sont d'excellentes méthodes, les deux doivent être archivées dans la boîte à outils de n'importe quel développeur. En fonction de vos besoins, vous constaterez peut-être que vous avez réellement besoin des deux concepts dans vos archives.
la source
J'ai adopté la réponse de @ Darkwaltz4 pour sa brièveté et je voudrais partager comment j'ai adapté la solution aux situations où le tableau peut contenir différentes clés pour chaque itération comme ceci:
et a maintenu une "clé principale" comme ceci:
array_merge aurait exécuté la fusion dans l'itération Array [1] basée sur $ master_key et produit ['some_key'] = '', une valeur vide, pour cette itération. Par conséquent, array_intersect_key a été utilisé pour modifier $ master_key à chaque itération comme ceci:
la source
Un peu tard, mais je n'ai pas trouvé la manière dont je l'ai implémentée, cette version doit être fermée, php> = 5.3, mais pourrait être modifiée pour ne pas:
Bien sûr, 'dontSortMe' doit être trié et peut apparaître en premier dans l'exemple
la source