J'ai un tableau associatif sous la forme key => value
où la clé est une valeur numérique, mais ce n'est pas une valeur numérique séquentielle. La clé est en fait un numéro d'identification et la valeur est un nombre. C'est très bien pour la plupart des instances, mais je veux une fonction qui obtient le nom lisible par l'homme du tableau et l'utilise pour la clé, sans changer la valeur.
Je n'ai pas vu une fonction qui fait cela, mais je suppose que je dois fournir l'ancienne clé et la nouvelle clé (que j'ai toutes les deux) et transformer le tableau. Existe-t-il un moyen efficace de procéder?
php
arrays
associative-array
Thomas Owens
la source
la source
Réponses:
la source
La façon de procéder et de conserver l'ordre du tableau consiste à placer les clés du tableau dans un tableau distinct, à rechercher et à remplacer la clé dans ce tableau, puis à la combiner à nouveau avec les valeurs.
Voici une fonction qui fait exactement cela:
la source
si votre
array
est construit à partir d'une requête de base de données, vous pouvez modifier la clé directement à partir de l'mysql
instruction:au lieu de
utilisez quelque chose comme:
la source
La réponse de KernelM est agréable, mais afin d'éviter le problème soulevé par Greg dans le commentaire (clés en conflit), l'utilisation d'un nouveau tableau serait plus sûre
la source
Vous pouvez utiliser un deuxième tableau associatif qui mappe les noms lisibles par l'homme aux identifiants. Cela fournirait également une relation plusieurs à un. Ensuite, faites quelque chose comme ceci:
la source
Si vous souhaitez également que la position de la nouvelle clé de tableau soit la même que l'ancienne, vous pouvez le faire:
la source
Si votre tableau est récursif, vous pouvez utiliser cette fonction: testez ces données:
voici la fonction:
la source
la source
J'aime la solution de KernelM, mais j'avais besoin de quelque chose qui puisse gérer les conflits de clés potentiels (où une nouvelle clé peut correspondre à une clé existante). Voici ce que j'ai trouvé:
Vous pouvez ensuite parcourir un tableau comme celui-ci:
la source
Voici une fonction d'aide pour y parvenir:
assez basé sur la réponse @KernelM .
Usage:
Il renverra true en cas de renommage réussi, sinon false .
la source
Trucs faciles:
cette fonction acceptera le hash $ cible et $ les remplacements est aussi un hash contenant des associations newkey => oldkey .
Cette fonction conservera l'ordre d'origine , mais pourrait être problématique pour les très grands tableaux (comme les enregistrements supérieurs à 10k) concernant les performances et la mémoire .
cette fonction alternative ferait de même, avec des performances et une utilisation de la mémoire bien meilleures , au prix de la perte de la commande d'origine (ce qui ne devrait pas être un problème car elle est hashtable!)
la source
ce code aidera à changer l'ancienne clé en une nouvelle
afficher comme
la source
Comparaison de référence simple des deux solutions.
Solution 1 Copiez et supprimez (commande perdue) https://stackoverflow.com/a/240676/1617857
Solution 2 Renommez la clé https://stackoverflow.com/a/21299719/1617857
Résultats:
la source
Vous pouvez utiliser cette fonction basée sur array_walk:
Il donne:
la source
cela fonctionne pour renommer la première clé:
ensuite, print_r ($ a) rend un tableau dans l'ordre réparé:
cela fonctionne pour renommer une clé arbitraire:
print_r ($ a)
une fonction généralisée:
la source
Si vous souhaitez remplacer plusieurs clés à la fois (en préservant l'ordre):
Usage:
la source
Il existe une autre façon de modifier la clé d'un élément de tableau lorsque vous travaillez avec un tableau complet - sans changer l'ordre du tableau. Il s'agit simplement de copier le tableau dans un nouveau tableau.
Par exemple, je travaillais avec un tableau mixte multidimensionnel qui contenait des clés indexées et associatives - et je voulais remplacer les clés entières par leurs valeurs, sans casser l'ordre.
Je l'ai fait en changeant la clé / valeur pour toutes les entrées du tableau numérique - ici: ['0' => 'foo']. Notez que la commande est intacte.
Production:
la source
la meilleure façon est d'utiliser la référence, et non d'utiliser unset (ce qui fait une autre étape pour nettoyer la mémoire)
Solution:
vous avez un original et une référence avec un nouveau nom.
ou si vous ne voulez pas avoir deux noms dans une valeur c'est bien faire un autre onglet et foreach sur référence
L'itération est meilleure sur les clés que le clonage de tous les tableaux, et le nettoyage de l'ancien tableau si vous avez des données longues comme 100 lignes +++ etc.
la source
Hmm, je ne fais pas de test avant, mais je pense que ce code fonctionne
la source
Celui qui préserve l'ordre qui est simple à comprendre:
la source
Vous pouvez écrire une fonction simple qui applique le rappel aux clés du tableau donné. Similaire à array_map
Voici un résumé https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php .
la source
Cette fonction renommera une clé de tableau, en conservant sa position, en combinant avec la recherche d'index.
Usage:
la source
Cette fonction de base gère l'échange de clés de tableau et le maintien du tableau dans l'ordre d'origine ...
Vous pouvez ensuite parcourir et échanger toutes les clés 'a' avec 'z' par exemple ...
la source