我有一个类似的数组:
$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);
}
我永远都不知道路径的样子,所以我需要某种函数来接收数组和该对象作为参数,并返回修改后的对象。
答案 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;
}