根据其他数组值中的键将数组值替换为另一个值
Replace array value with another value based on keys from other array values
我有一个数组 $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
)
和一个值为 CHANGED
的变量 $value
我正在寻找一种方法来更改
的值
$report[03.05.2016][tasks][group1]
所以我的最终数组将是:
(
[03.05.2016] => Array
(
[tasks] => Array
(
[group1] => CHANGED
)
[start] => 8:00
[end] => 16:00
)
)
有人可以帮助我吗?
尝试$report[$keys[0]][$keys[1]][$keys[2]] = $value;
Refer : https://3v4l.org/0HBUH
您可以深入研究 $report
变量,通过引用为 $keys
数组中的每个 "step" 赋值,然后将最终级别更改为您的新值。
编辑:
这种方法的优点是它适用于任意数量的级别,但如果你总是只有三个步骤,那么@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
)
)
您可以在这里使用递归函数方法,将源、键和值传递给函数。它将检查键是否存在于数组中,如果找到则使用剩余数据、键和值调用相同的函数。
最后键在所有键都被搜索时留空,现在您可以简单地更新值,并且 return 为真,否则 return 如果找不到则为假。
$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
我有一个数组 $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
)
和一个值为 CHANGED
$value
我正在寻找一种方法来更改
的值$report[03.05.2016][tasks][group1]
所以我的最终数组将是:
(
[03.05.2016] => Array
(
[tasks] => Array
(
[group1] => CHANGED
)
[start] => 8:00
[end] => 16:00
)
)
有人可以帮助我吗?
尝试$report[$keys[0]][$keys[1]][$keys[2]] = $value;
Refer : https://3v4l.org/0HBUH
您可以深入研究 $report
变量,通过引用为 $keys
数组中的每个 "step" 赋值,然后将最终级别更改为您的新值。
编辑: 这种方法的优点是它适用于任意数量的级别,但如果你总是只有三个步骤,那么@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
)
)
您可以在这里使用递归函数方法,将源、键和值传递给函数。它将检查键是否存在于数组中,如果找到则使用剩余数据、键和值调用相同的函数。
最后键在所有键都被搜索时留空,现在您可以简单地更新值,并且 return 为真,否则 return 如果找不到则为假。
$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