Renommer une clé dans un tableau PHP

Oui, je sais c'est pas souvent qu'on doit faire ce genre d'opération, mais en travaillant avec MongoDB, je suis tombé sur la problématique suivante : dans MongoDB, l'identifiant des documents générés automatiquement se nomme _id. Pour conserver le nom de clé primaire que j'utilise habituellement avec des SGBDR classiques (id), je suis amené à devoir renommer une clé d'un tableau.

J'ai procédé ainsi :

<?php
// Crée une nouvelle clé avec le contenu de l'ancienne
$data['id'] = $data['_id'];
// Supprime l'ancienne
unset($data['_id']);
?>

Pas super élégant, mais ça fonctionne. Vous avez mieux ?

Etiquettes:

Commentaires

Bonjour,

Je ne pense pas qu'il existe une meilleure solution.
Il n'est pas possible en PHP d'adresser la clé d'une entrée de tableau ; du coup, impossible d'en modifier sa valeur.

Bonjour,

Il y a bien array_flip, mais en plus d'un risque de perdre des données, ce sera moins performant...

Après il y a la possibilité d'utiliser zend_hash_update (fonction en C de moteur Zend), reste à faire la fonction en PHP !

problème :
l'ordre initial des clés n'est plus respecté : 'id' sera nécessairement à la fin du tableau mais sans doute pas d'autre possibilité, en effet.

Pour respecter l'ordre du tableau, il faudrait utiliser array_splice. Ne connaissant pas précisément la façon dont sont implémentés les tableaux PHP, je ne sais pas ce que ça donne au niveau des performances.

Je peux me tromper, mais array_splice ne doit pas permettre un remplacement avec un tableau associatif (enfin, du moins, le remplacement est possible mais la clé est perdue).

Il n'y a pas de solution miracle pour renommer une clé et garder l'ordre : dépiler le 1er élément du tableau d'origine, créer un tableau temporaire avec la nouvelle clé et fusionner les deux dans un nouveau tableau.

Effectivement, il semblerait que l'on ne puisse pas insérer des éléments en spécifiant les clés avec array_splice. Dans les commentaires sur la documentation, il y a cependant plusieurs propositions pour contourner ce problème.

et un truc comme ca ? :
$data = array_merge(array('id'=>$data['_id']), $data);
unset($data['_id']);

qui permet de garder l'ordre des clés, en supposant que l'id est en première position.
Par contre si tu veux vraiment garder la position des clés, et que l'id est n'est pas forcément en première position, je ne vois que ca :
$out = array();
foreach ($data as $k=>$v ){
if ($k == '_id'){
$out['id'] = $v;
} else {
$out[$k] = $v;
}
}

Disons que si on en arrive à ce point c'est que conceptuellement, on à peut-être plus à faire à un tableau classique. La structure de données trouverai une meilleurs place dans un itérateur adapté, pas très complexe, mais avec une méthode de remplacement intégrée.

Ce n'est qu'une idée au vol, non testée.

Oui, je sais c'est pas souvent qu'on doit faire ce genre d'opération <- Pas faux, mais j'en ai eu besoin ce matin même ! Impeccable donc. Moi qui cherchait une méthode bien plus compliquée et tordue, cela m'a fait gagné un temps precieux ! Merci

Juste pour signaler une erreur de lien vers MongoDB (2x http://).

Pour renommer une clé je ferais la même solution poster par l'auteur. Léger et court.

Pages

Ajouter un commentaire