我正在查看php.net中的array_merge
和array_combine
等函数,但我仍然不知道如何实现我对数组的假设。我的假设数组如下。
$data1 = array(
[0]=>array(
[2]=>array(
[subject1]=>30
[subject2]=>50
)
)
[1]=>array(
[3]=>array(
[subject1]=>30
[subject2]=>50
)
)
)
$data2 = array(
[0]=>array(
[2]=>array(
[subject1]=>20
[subject2]=>70
)
)
[1]=>array(
[3]=>array(
[subject1]=>30
[subject2]=>40
)
)
)
如何将上述2(可以是更多数组)数组放入一个数组中,如下所示:
$datamerge = array(
[0]=>array(
[2]=>array(
[subject1]=>50
[subject2]=>120
)
)
[1]=>array(
[3]=>array(
[subject1]=>60
[subject2]=>90
)
)
)
请帮帮我。这是我的项目,对我来说非常重要。
答案 0 :(得分:2)
如果您完全确定两个数组具有完全相同的嵌套结构,那么每个级别的每个键都存在于两个数组中,那么您可以这样写:
function array_sum_recursive ($data1, $data2) {
if (!is_array($data1)) {
return $data1 + $data2;
}
foreach ($data1 as $key => $value) {
$result[$key] = array_sum_recursive($data1[$key], $data2[$key]);
}
return $result;
}
$result = array_sum_recursive($data1, $data2);
var_export($result);
使用您提供的数据输出:
array (
0 =>
array (
2 =>
array (
'subject1' => 50,
'subject2' => 120,
),
),
1 =>
array (
3 =>
array (
'subject1' => 60,
'subject2' => 90,
),
),
)
但是,使函数处理可能与此不相符的输入数组会更安全。由于必须完成所有测试,它使功能更长:
function array_sum_recursive($data1, $data2) {
if (!is_array($data1) && !is_array($data2)) {
return $data1 + $data2;
}
// deepest array gets precedence
if (!is_array($data2)) {
return $data1;
}
if (!is_array($data1)) {
return $data2;
}
$keys = array_unique(array_merge(array_keys($data1), array_keys($data2)));
foreach ($keys as $key) {
if (isset($data1[$key]) && isset($data2[$key])) {
$result[$key] = array_sum_recursive($data1[$key], $data2[$key]);
} else if (isset($data1[$key])) {
$result[$key] = $data1[$key];
} else {
$result[$key] = $data2[$key];
}
}
return $result;
}
如果你需要添加两个以上的数组,你可以逐步将下一个数组加到前一个总和的结果中,如下所示:
$result = array_sum_recursive($data1, $data2);
$result = array_sum_recursive($result, $data3);
$result = array_sum_recursive($result, $data4);
// etc.
你甚至可以为它编写一个函数,它接受可变数量的参数(参见func_get_args()):
function array_sum_recursive_all() {
$result = array();
foreach(func_get_args() as $data) {
$result = array_sum_recursive($result, $data);
}
return $result;
}
然后你可以写:
$result = array_sum_recursive_all($data1, $data2, $data3, $data4);