2016-06-11 69 views
1

我有一个JSON对象,我尝试修改。所以我创建了以下功能。我首先反序列化JSON对象,然后给出数组以及我想要修改该值的路径。在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; 
} 

我尝试了很多东西(递归,& ARR),使其动态地工作,但我的PHP的经验是有限的,我不能让它的工作。

有没有一个干净的方式来做到这一点。有什么替代方法可以尝试吗?

例如我有以下的JSON,我想修改subsubkey到值2

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

我反序列化使用json_decode($json, true);它,我创建了$path阵列这将是

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

你能显示'$ arr,$ path,$ value'的输入值吗? – RomanPerekhrest

+2

[PHP:使用单独数组中定义的路径设置多维关联数组元素的值]的可能副本(http://stackoverflow.com/questions/6123061/php-set-the-value-of-a- multidimensional-associative-array-element-using-a-path) –

+0

@MattRaines这不是一回事。 – YoloQ

回答

1

如果您不希望创建新更新的数组递归可以使用引用。以下代码遍历给定数组,并在每次迭代中更改对嵌套数组的引用,直到它到达要更改的字段。

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

这就是我想表达的内容,但我认为我滥用了参考。 – YoloQ

+0

我也可以使用它删除找到的密钥吗? – YoloQ

+0

是的,但代码会有点不同。你必须''''''''''从路径中最后一个键。 –

1

这是你在找什么?

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

} 

输出:

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

这将递归地改变所有的键,而不是'$ path'中指定的键。 – YoloQ

+0

@YoloQ我编辑过,所以它会检查“subsubkey”。这对你有用吗?它不会检查整个路径。只是路径中的最后一个键。 –

+0

@YoloQ做到了吗? –