我目前有这种格式的数组。
$test_arr = [
'key1' => [
'key2' => [
'key3' => 'value',
],
],
'key4' => 'value 2',
'key5' => 'value 3',
];
我的目标是能够取代'价值'在key3中有另一个值。 test_arr的结构不会被人知道,并且每次都会完全不同,所以我使用函数在数组中找到它的位置。
function array_find_deep($array, $search, $keys = array())
{
foreach($array as $key => $value) {
if (is_array($value)) {
$sub = array_find_deep($value, $search, array_merge($keys, array($key)));
if (count($sub)) {
return $sub;
}
} elseif ($value === $search) {
return array_merge($keys, array($key));
}
}
return array();
}
当我像我的测试数组一样使用这个函数时:
$ key = array_find_deep($ test_arr,' value');
它返回一个包含内容的数组:
['key1','key2','key3']
我现在知道我需要去的数组中的路径,但是我不知道如何利用这个来改变key3的值
我通过创建另一个功能
进行了尝试function replaceValueWithKeyMap($key, &$arr, $new_val, &$i = 0) {
$length = count($key);
if ($i >= $length-1) {
$arr[$key[$i]] = $new_val;
return $arr;
} else {
$i++;
replaceValueWithKeyMap($key, $arr[$key[$i]], $new_val, $i);
}
}
但是当我做的时候
replaceValueWithKeyMap($键,$ test_arr,' NEWVALUE&#39);
我回来了
$test_arr = [
'key1' => [
'key2' => [
'key3' => 'value',
],
],
'key4' => 'value 2',
'key5' => 'value 3',
'key3' => [
'key3' => 'newvalue',
],
];
如果我有一个键路径数组,我该如何利用它来改变使用该路径的值。
答案 0 :(得分:1)
在函数replaceValueWithKeyMap()
中,您可以通过循环键并保持数组中当前“路径”的引用来避免递归调用。
function replaceValueWithKeyMap($keys, &$arr, $new_val) {
if (empty($keys)) return ; // Don't change $arr if $keys is empty
$ref =& $arr ; // path starts with the root of $arr
foreach ($keys as $key) { // for each keys
$ref =& $ref[$key] ; // update the path
}
$ref = $new_val; // apply the new value
}
输出:
Array
(
[key1] => Array
(
[key2] => Array
(
[key3] => newvalue
)
)
[key4] => value 2
[key5] => value 3
)
完整代码(demo):
function array_find_deep($array, $search, $keys = array())
{
foreach($array as $key => $value) {
if (is_array($value)) {
$sub = array_find_deep($value, $search, array_merge($keys, array($key)));
if (count($sub)) {
return $sub;
}
} elseif ($value === $search) {
return array_merge($keys, array($key));
}
}
return array();
}
function replaceValueWithKeyMap($keys, &$arr, $new_val) {
if (empty($keys)) return ; // Don't change $arr if $keys is empty
$ref =& $arr ; // path starts with the root of $arr
foreach ($keys as $key) { // for each keys
$ref =& $ref[$key] ; // update the path
}
$ref = $new_val; // apply the new value
}
$test_arr = [
'key1' => [
'key2' => [
'key3' => 'value',
],
],
'key4' => 'value 2',
'key5' => 'value 3',
];
$key = array_find_deep($test_arr, 'value');
replaceValueWithKeyMap($key,$test_arr,'newvalue');
print_r($test_arr);