2016-06-11 1 views
1

J'ai un objet JSON que j'essaie de modifier. J'ai donc créé la fonction suivante. Je désérialise d'abord l'objet JSON puis, étant donné le tableau et le chemin que je veux modifier, je modifie la valeur.Valeur d'édition laide sur un tableau imbriqué PHP

function setInDict($arr, $path, $value){ 
    switch(sizeof($path)){ 
     case 1: 
      $arr[$path[0]] = $value; 
      break; 
     case 2: 
      $arr[$path[0]][$path[1]] = $value; 
      break; 
     case 3: 
      $arr[$path[0]][$path[1]][$path[2]] = $value; 
      break;  
     case 4: 
      $arr[$path[0]][$path[1]][$path[2]][$path[3]] = $value; 
      break; 
     case 5: 
      $arr[$path[0]][$path[1]][$path[2]][$path[3]][$path[4]] = $value; 
      break; 
    } 
    return $arr; 
} 

J'ai essayé beaucoup de choses (récursion, & arr) pour le faire fonctionner de manière dynamique, mais mon expérience de PHP est limité et je ne peux pas le faire fonctionner.

Existe-t-il un moyen propre de le faire. Y a-t-il quelque chose d'autre que je peux essayer?

Par exemple je le JSON suivant et je veux modifier subsubkey à la valeur 2

{ 
    "key":{ 
    "subkey":{ 
     "subsubkey":3 
    } 
    } 
} 

Je deserialize à l'aide json_decode($json, true); et je crée le tableau $path qui serait

['key', 'subkey', 'subsubkey'] 
+0

pouvez-vous afficher les valeurs d'entrée de $ arr, $ path, $ value'? – RomanPerekhrest

+2

Copie possible de [PHP: Définir la valeur d'un élément de tableau associatif multidimensionnel en utilisant un chemin défini dans un tableau séparé] (http://stackoverflow.com/questions/6123061/php-set-the-value-of-a- multidimensionnel-associative-array-element-using-a-path) –

+0

@MattRaines Ce n'est pas la même chose. – YoloQ

Répondre

1

Si vous ne voulez pas créer de nouveau tableau mis à jour récursive, vous pouvez utiliser des références. Le code suivant parcourt le tableau donné et à chaque itération modifie la référence au tableau imbriqué jusqu'à ce qu'il atteigne le champ que vous souhaitez modifier.

function setInDict(array $array, array $path, $value) 
{ 
    if (!$path) { 
     return $array; 
    } 

    $found = &$array; 
    foreach ($path as $field) { 
     if (!isset($found[$field]) || !array_key_exists($field, $found)) { 
      throw new \InvalidArgumentException("There is no nested field '$field' in the given array"); 
     } 

     $found = &$found[$field]; 
    } 

    $found = $value; 

    return $array; 
} 
+0

C'est ce que j'essayais d'exprimer mais je pense que j'ai mal utilisé les références. – YoloQ

+0

Puis-je également supprimer la clé trouvée en utilisant ceci? – YoloQ

+0

Oui, mais le code sera un peu différent. Vous devez '' '' unset''' la dernière clé du chemin. –

1

Est-ce Qu'est-ce que tu cherches?

$x= '{ 
    "key":{ 
    "subkey":{ 
     "subsubkey":3 
    }, 
    "subkeyx":{ 
     "subsuwefwef":3 
    } 
    } 
}'; 

$x = json_decode($x, true); 
echo json_encode(checkValue($x,2,"subsubkey")); 

function checkValue($x,$y,$keyName){ 

    if(is_array($x)){ 
     foreach($x as $key=>$value){ 
      if(is_array($value)){ 
       $check = checkValue($value,$y,$keyName); 
       $x[$key] = $check; 
      }elseif($key == $keyName){ 
       $x[$key] = $y; 

      } 

     } 
    } 

    return $x; 

} 

Sortie:

{"key":{"subkey":{"subsubkey":2},"subkeyx":{"subsuwefwef":3}}} 
+0

Cela changera toutes les clés de façon récursive et non celle spécifiée dans le $ chemin. – YoloQ

+0

@YoloQ Je l'ai édité donc il va vérifier "subsubkey". Cela fonctionnera-t-il pour vous? il ne vérifiera pas tout le chemin. juste la dernière clé sur le chemin. –

+0

@YoloQ a-t-il fonctionné? –