php - 合并三个不同长度的多维数组
问题描述
将 3 个不同长度且没有重复键的多维数组合并到一个数组中时,我遇到了一个小问题,如下所示:
我的 3 个数组:
$volume380 = array {
array {
"DATE" => "2018-07-30"
"VOLUME380" => 813.0
}
array {
"DATE" => "2018-07-31"
"VOLUME380" => 1188.0
}
array {
"DATE" => "2018-08-01"
"VOLUME380" => 1081.0
}
array {
"DATE" => "2018-08-02"
"VOLUME380" => 886.0
}
}
$volume320 = array {
array {
"DATE" => "2018-07-30"
"VOLUME320" => 813.0
}
array {
"DATE" => "2018-07-31"
"VOLUME320" => 1188.0
}
array {
"DATE" => "2018-08-02"
"VOLUME320" => 1081.0
}
}
$volume800 = array {
array {
"DATE" => "2018-07-30"
"VOLUME800" => 813.0
}
array {
"DATE" => "2018-07-31"
"VOLUME800" => 1188.0
}
array {
"DATE" => "2018-08-01"
"VOLUME800" => 1081.0
}
array {
"DATE" => "2018-08-02"
"VOLUME800" => 886.0
}
}
我想要的结果:
$volumeTot = array {
array {
"DATE" => "2018-07-30"
"VOLUME380" => 813.0
"VOLUME320" => 813.0
"VOLUME800" => 813.0
}
array {
"DATE" => "2018-07-31"
"VOLUME380" => 1188.0
"VOLUME320" => 1188.0
"VOLUME800" => 1188.0
}
array {
"DATE" => "2018-08-01"
"VOLUME380" => 1081.0
"VOLUME800" => 1081.0
}
array {
"DATE" => "2018-08-02"
"VOLUME380" => 886.0
"VOLUME320" => 1081.0
"VOLUME800" => 886.0
}
}
我尝试了不同的方法来解决这个问题,但由于数组的长度不同,我有点坚持这一点。
我尝试过使用 for 循环和数组合并,但它没有达到我想要的效果。
谢谢你的帮助。
解决方案
从您的数据来看,“日期”似乎本身就是“关键”。考虑到这种逻辑,函数“array_indexer”将现有数据点(例如 $volume380)转换为使用“DATE”作为数组键的索引数组。创建第二个函数“array_deindexer”以将数组格式恢复为原始数据出现的格式。
合并发生在函数“array_combiner”内部,该函数“索引”给定的新数组和累积的数组,然后组合公共键(如“DATE”值中)。
完整代码如下:
$volume380 = array (
array (
"DATE" => "2018-07-30",
"VOLUME380" => 813.0
),
array (
"DATE" => "2018-07-31",
"VOLUME380" => 1188.0
),
array (
"DATE" => "2018-08-01",
"VOLUME380" => 1081.0
),
array (
"DATE" => "2018-08-02",
"VOLUME380" => 886.0
)
);
$array_final = array_combiner($volume380);
$volume320 = array (
array (
"DATE" => "2018-07-30",
"VOLUME320" => 813.0
),
array (
"DATE" => "2018-07-31",
"VOLUME320" => 1188.0
),
array (
"DATE" => "2018-08-02",
"VOLUME320" => 1081.0
)
);
$array_final = array_combiner($volume320);
$volume800 = array (
array (
"DATE" => "2018-07-30",
"VOLUME800" => 813.0
),
array (
"DATE" => "2018-07-31",
"VOLUME800" => 1188.0
),
array (
"DATE" => "2018-08-01",
"VOLUME800" => 1081.0
),
array (
"DATE" => "2018-08-02",
"VOLUME800" => 886.0
)
);
$array_final = array_combiner($volume800);
print_r($array_final);
function array_combiner($array_tmp) {
global $array_final;
$array_tmp = array_indexer($array_tmp);
$tmp = array();
if (count($array_final) > 0) {
$tmp = array_indexer($array_final);
foreach ($array_tmp as $k1 => $v1) {
if (!isset($tmp[$k1])) $tmp[$k1] = array();
foreach ($v1 as $k2 => $v2) {
$tmp[$k1][$k2] = $v2;
}
}
} else $tmp = $array_tmp;
return array_deindexer($tmp);
}
function array_indexer($array_tmp) {
$tmp = array();
foreach ($array_tmp as $k1 => $v1) {
$index = "";
$data = array();
foreach ($v1 as $k2 => $v2) {
if ($k2 == "DATE") $index = $v2;
else $data[$k2] = $v2;
}
if (strlen($index) > 0) $tmp[$index] = $data;
}
return $tmp;
}
function array_deindexer($array_tmp) {
$tmp = array();
$i = 0;
foreach ($array_tmp as $k1 => $v1) {
$tmp[$i]["DATE"] = $k1;
foreach ($v1 as $k2 => $v2) $tmp[$i][$k2] = $v2;
$i++;
}
return $tmp;
}
推荐阅读
- android - 如何在 Android 上将向上操作图标更改为带有文本的按钮?
- c++ - log4cpp 是否处理堆碎片问题?
- python - 如何在 python Enum 中更改 auto 的基值?
- scala - 如何更改 Ammonite、coursier 缓存位置?
- python - 在 Django 视图和模板中调用当前用户
- c# - 类型参数不能从用法中推断出来,但似乎很明显
- c++ - 为什么说在 C++ 入门 5 中引用没有改变,下面的代码是如何工作的?
- javascript - 平滑的单击缩放功能适用于某些标记,但不适用于其他标记
- python - 你能在同一个代码中启动一个线程和一个进程吗?
- javascript - 从手机上的手表打开 URL (Tizen)