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