根据其他数组值

时间:2016-06-15 09:09:16

标签: php arrays key

我有一个数组$report

Array
(
    [03.05.2016] => Array
        (
            [tasks] => Array
                (
                    [group1] => to change
                )

            [start] => 8:00
            [end] => 16:00
        )

)

和第二个数组$keys

Array
(
    [0] => 03.05.2016
    [1] => tasks
    [2] => group1
)

和变量$value,其值为CHANGED

我正在寻找一种方法来改变

的价值
$report[03.05.2016][tasks][group1]

这样我的最终数组将是:

(
    [03.05.2016] => Array
        (
            [tasks] => Array
                (
                    [group1] => CHANGED
                )

            [start] => 8:00
            [end] => 16:00
        )

)

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

尝试$report[$keys[0]][$keys[1]][$keys[2]] = $value;

  

参考:https://3v4l.org/0HBUH

答案 1 :(得分:1)

您可以查看$report变量,通过引用分配每个"步骤"在$keys数组中,然后将最终级别更改为新值。

编辑: 这种方法的优点是它可以适用于任何级别,但如果你总是只有三步,那么@ zakhefron的答案就更清楚了。

<?php
$report = [
    '03.05.2016' => [
        'tasks' => [
            'group1' => 'to change'
        ],

        'start' => 8:00
        'end'   => 16:00
    ]
];

$keys = ['03.05.2016', 'tasks', 'group1'];

$value = 'CHANGED';

// Start at the top level of $report
$target =& $report;

// Then work down through the keys
while ($key = array_shift($keys))
{
    $target =& $target[$key];
}

// Finally, set the final target to the new value
$target = $value;

print_r($report);

=

Array
(
    [03.05.2016] => Array
        (
            [tasks] => Array
                (
                    [group1] => CHANGED
                )

            [start] => 8:00
            [end] => 16:00
        )

)

答案 2 :(得分:1)

这里可以使用递归函数方法,将源,键和值传递给函数。它将检查数组中是否存在键,如果找到,则使用剩余数据,键和值调用相同的函数。

最后,当所有搜索到的键时,键都空了,现在你可以简单地更新值,然后返回true,否则返回false,如果找不到的话。

$report = array(
    '03.05.2016' => array(
        'tasks' => Array(
            'group1' => 'to change'
        ),
        'start' => '8:00',
        'end' => '16:00'
));

$keys = array(
    '03.05.2016', 
    'tasks',
    'group1'
);

$value = 'CHANGED';

function updateValue(&$source, $keys, $value) {
    $keysCount = count($keys);
    if(empty($keys)) {
        $source = $value;
        return true;
    }
    foreach($keys as $key) {
        if(isset($source[$key])) {
            array_shift($keys);
            return updateValue($source[$key], $keys, $value);
        }
        else return false;
    }
}

updateValue($report, $keys, $value);
print_r($report);

看到它正常工作:https://eval.in/589461