在给定显示嵌套路径的键数组的情况下,更改关联数组中的嵌套值

时间:2018-04-17 14:49:51

标签: php arrays

我目前有这种格式的数组。

$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',
    ],
 ];

如果我有一个键路径数组,我该如何利用它来改变使用该路径的值。

1 个答案:

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