PHP嵌套数组

时间:2016-06-11 09:05:25

标签: php arrays json

我有一个我尝试修改的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']

2 个答案:

答案 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;
}