383 votes

Remplacer les clés dans un tableau en fonction d'un autre tableau de recherche/correspondance

J'ai un tableau associatif sous la forme clé => valeur où la clé est une valeur numérique, cependant 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 comptage. Cela fonctionne dans la plupart des cas, cependant 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 de fonction qui fait ça, mais je suppose que je dois fournir l'ancienne clé et la nouvelle clé (que j'ai toutes les deux) et transformer le tableau. Y a-t-il un moyen efficace de faire cela?

0 votes

Voir des questions similaires stackoverflow.com/q/308703

638voto

KernelM Points 3234
$arr[$newkey] = $arr[$oldkey];
unset($arr[$oldkey]);

6 votes

Faites juste attention que 1) Aucune clé n'a la même version lisible par l'homme 2) Aucune version lisible par l'homme ne doit être un nombre

87 votes

Aussi cela pourrait probablement modifier l'ordre du tableau, dont vous devrez peut-être être prudent. Même les tableaux associatifs en PHP sont ordonnés, et parfois cet ordre est exploité.

8 votes

Oui, excellent point Robin. Y a-t-il un moyen de conserver le même ordre ? Ou devez-vous créer un nouveau tableau pour y parvenir ?

109voto

Omar Jackman Points 6632

La façon de faire ceci et de conserver l'ordre du tableau est de mettre les clés du tableau dans un tableau séparé, trouver et remplacer la clé dans ce tableau, puis le combiner à nouveau avec les valeurs.

Voici une fonction qui fait exactement cela :

function change_key( $array, $old_key, $new_key ) {

    if( ! array_key_exists( $old_key, $array ) )
        return $array;

    $keys = array_keys( $array );
    $keys[ array_search( $old_key, $keys ) ] = $new_key;

    return array_combine( $keys, $array );
}

3 votes

Merci, cela a été vraiment utile car j'avais besoin de préserver l'ordre du tableau. J'avais déjà essayé la réponse acceptée avant de trouver cette page.

4 votes

Oui, je préfère beaucoup préserver l'ordre du tableau, cela semble plus propre.

3 votes

A dû conserver l'ordre des clés, bonne chose, a fonctionné comme un charme!

59voto

Simon Franco Points 241

Si votre array est construit à partir d'une requête de base de données, vous pouvez changer la clé directement depuis l'instruction mysql:

au lieu de

"select ´id´ from ´tablename´..."

utilisez quelque chose comme:

"select ´id´ **as NEWNAME** from ´tablename´..."

0 votes

Excellente réponse, très précieuse !

21voto

kjg Points 98

La réponse de KernelM est bonne, mais pour éviter le problème soulevé par Greg dans le commentaire (clés en conflit), il serait plus sûr d'utiliser un nouveau tableau

$newarr[$newkey] = $oldarr[$oldkey];
$oldarr=$newarr;
unset($newarr);

0 votes

Ceci est une bonne solution, tant que votre tableau est de taille raisonnable. Si votre tableau consomme plus de la moitié de la mémoire PHP disponible, cela ne fonctionnera pas.

13 votes

@kingjeffrey, pas vraiment. Les valeurs du tableau ne seront pas dupliquées tant qu'elles sont "juste copiées" sans être modifiées. Par exemple, s'il y a un tableau qui contient 10'000 éléments et consomme 40 Mo de mémoire, le copier va consommer la mémoire nécessaire pour stocker seulement les références aux valeurs existantes plutôt que les copies des valeurs, donc si un tableau consomme 40 Mo, sa copie pourrait peut-être consommer seulement 0,5 Mo (testé).

17voto

Tom Ritter Points 44352

Vous pourriez utiliser un deuxième tableau associatif qui fait correspondre des noms lisibles par l'humain aux identifiants. Cela offrirait également une relation de type Many to 1. Ensuite, faites quelque chose comme ceci :

echo 'Widgets : ' . $data[$humanreadbleMapping['Widgets']];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X