Si tu as besoin de remplacer menu2 par une autre chaîne tu dois te tourner vers le 2ème exemple de code.
Le code que tu as écris n'est pas très cohérent et contient des erreurs. Le str_replace entre autre sert à modifier une chaine de caractère, or dans ce cas (avec le json_decode), menu2 est une propriété d'objet et non une chaine de caractères et on ne peut pas modifier le nom d'une propriété d'objet. On peut la copier dans une autre et la supprimer.
Tu peux donc faire comme ceci (pas la peine de mémoriser la propriété dans une variable intermédiaire comme dans mon exemple précédent) :
<?php
// ici $data est un objet php
$data = json_decode(file_get_contents('ok.json'));
// copie menu2 dans supermenu
$data->menu1->supermenu = $data->menu1->menu2;
// supprime menu2
unset($data->menu1->menu2);
file_put_contents('ok.json', json_encode($data));
Tu pourrais éventuellement utiliser le str_replace mais dans ce cas en traitant directement le contenu du fichier json sans faire un json_decode :
<?php
// ici $data est une chaine de caractère contenant l'ensemble du fichier
$data = file_get_contents('ok.json');
// remplacement la chaine menu2 par la chaine supermenu
$data = str_replace('menu2', 'supermenu', $data);
file_put_contents('ok.json', $data);
Mais si tu as plusieurs fois menu2 dans le fichier json, ça va tous les remplacer.
Si tu as besoin de remplacer menu2 par une autre chaîne tu dois te tourner vers le 2ème exemple de code.
Le code que tu as écris n'est pas très cohérent et contient des erreurs. Le str_replace entre autre sert à modifier une chaine de caractère, or dans ce cas (avec le json_decode), menu2 est une propriété d'objet et non une chaine de caractères et on ne peut pas modifier le nom d'une propriété d'objet. On peut la copier dans une autre et la supprimer.
Tu peux donc faire comme ceci (pas la peine de mémoriser la propriété dans une variable intermédiaire comme dans mon exemple précédent) :
[PHP]
<?php
// ici $data est un objet php
$data = json_decode(file_get_contents('ok.json'));
// copie menu2 dans supermenu
$data->menu1->supermenu = $data->menu1->menu2;
// supprime menu2
unset($data->menu1->menu2);
file_put_contents('ok.json', json_encode($data));[/PHP]
Tu pourrais éventuellement utiliser le str_replace mais dans ce cas en traitant directement le contenu du fichier json sans faire un json_decode :
[PHP]<?php
// ici $data est une chaine de caractère contenant l'ensemble du fichier
$data = file_get_contents('ok.json');
// remplacement la chaine menu2 par la chaine supermenu
$data = str_replace('menu2', 'supermenu', $data);
file_put_contents('ok.json', $data);[/PHP]
Mais si tu as plusieurs fois menu2 dans le fichier json, ça va tous les remplacer.