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 ?

Portrait de SamRay1024

Bonjour, Je ne pense pas

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.

Portrait de gege2061

Bonjour, Il y a bien

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 !

Portrait de David

problème : l'ordre initial

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.

Portrait de Maxence

Pour respecter l'ordre du

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.

Portrait de SamRay1024

Je peux me tromper, mais

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.

Portrait de Maxence

Effectivement, il semblerait

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.

Portrait de Greg

et un truc comme ca ? : $data

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;
	}
}

Portrait de Moosh

Disons que si on en arrive à

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.

Portrait de boulet_sensei

Oui, je sais c'est pas

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

Portrait de Nicolas

Juste pour signaler une

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.

Poster un nouveau commentaire

Le contenu de ce champ ne sera pas montré publiquement. If you have a Gravatar account associated with the e-mail address you provide, it will be used to display your avatar.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • You can enable syntax highlighting of source code with the following tags: <code>, <php>.

Plus d'informations sur les options de formatage

CAPTCHA
La vérification ne tient pas compte des minuscules ou des majuscules.
Image CAPTCHA
Enter the characters shown in the image.