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 ?
Commentaires
SamRay1024 (non vérifié)
mar, 20/07/2010 - 10:35
Permalink
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.
gege2061 (non vérifié)
mar, 20/07/2010 - 11:10
Permalink
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 !
David (non vérifié)
mar, 20/07/2010 - 11:18
Permalink
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.
Maxence
mar, 20/07/2010 - 12:00
Permalink
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.
SamRay1024 (non vérifié)
mar, 20/07/2010 - 12:30
Permalink
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.
Maxence
mar, 20/07/2010 - 13:52
Permalink
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.
Greg (non vérifié)
mar, 20/07/2010 - 16:52
Permalink
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;
}
}
Moosh (non vérifié)
mar, 20/07/2010 - 18:55
Permalink
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.
boulet_sensei (non vérifié)
mer, 21/07/2010 - 10:13
Permalink
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
Nicolas (non vérifié)
mer, 20/10/2010 - 16:53
Permalink
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.
Pages
Ajouter un commentaire