我正在 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
)
)
)
请帮助我。这是我的项目,对我来说非常重要。
当你绝对确定两个数组具有完全相同的嵌套结构,以便每个级别的每个键都存在于两个数组中时,那么你可以这样写:
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);