通过数组中的路径更改json中的值

时间:2019-04-03 14:30:45

标签: php json

我有一个类似的数组:

$arr = ["pages","homepage","welcomeText"];
$newWelcomeText = "Hello there";

和JSON如下:

{
  lang: "en",
  something: [0, 1, 33],
  pages: {
    homepage: {
      welcomeText: "Hello!",
      subHeaiding: "have a nice day"
    }
  }
}

,我想找到一种方法来用新值替换“ welcomeText”。 我尝试了类似的方法:

public function findAndReplace ($path, $obj, $data, $index = 0) {
        if($index + 1 == sizeof($path)) {
            if(!is_array($obj)) {
                $obj = json_decode(json_encode($obj), true);
            }
            $obj[$path[$index]] = $data;
            return $obj;
        }
        return $this->findAndReplace($path, $obj, $data, $index + 1);
    }

我永远都不知道路径的样子,所以我需要某种函数来接收数组和该对象作为参数,并返回修改后的对象。

2 个答案:

答案 0 :(得分:0)

您可以将array_walk_recursive函数与一些额外的功能配合使用,以允许对数组值的引用访问。

创建一些函数array_walk_recursive_referential,该函数将允许对每个键/值的引用访问并将其传递给您自己发送的函数($function):

function array_walk_recursive_referential(&$array, $function, $parameters = []) {
    $reference_function = function(&$value, $key, $userdata) {
        $parameters = array_merge([$value], [$key], $userdata[1]);
        $value = call_user_func_array($userdata[0], $parameters);
    };
    array_walk_recursive($array, $reference_function, [$function, $parameters]);
}

并与您的$arr数据一起使用:

array_walk_recursive_referential($arr, function($value, $key) {
    if(is_string($key))
    {
        if($key === 'welcomeText')
        {
            $value = 'My New Welcome Text'
        }
    }
    return $value;
});

您的$arr变量随引用一起传递,因此您无需在函数调用后重新分配它。

答案 1 :(得分:0)

如果我想用数组中给出的路径替换JSON onbject中的值,我将得到以下结果:

$json = '{
  lang: "en",
  something: [0, 1, 33],
  pages: {
    homepage: {
      welcomeText: "Hello!",
      subHeaiding: "have a nice day"
    }
  }
}'
$obj = json_decode($json, true);
$path = ["pages","homepage","welcomeText"]

下面的函数获取对象和数组中键的路径,并返回修改后的对象。

function findAndReplace ($obj, $path, $data, $index = 0) {
        if($index + 1 == sizeof($path)) {
            if(!is_array($obj)) {
                $obj = json_decode(json_encode($obj), true);
            }
            $obj[$path[$index]] = $data;
            return $obj;
        }
        $obj[$path[$index]] = findAndReplaceAndDo($obj[$path[$index]], $path, $data, $index + 1);

        return $obj;
    }