我有2个阵列(也可能更多),他们可能有散射数据。
Date | Apple Date | Banana
----------------- -------------------
1 | 5 1 | 3
4 | 5 3 | 1
5 | 5 7 | 2
数组结构如下所示。
array
(
[0] => array
(
[date] => 4
[apple] => 5
)
[1] => array
(
[date] => 5
[apple] => 5
)
)
我需要的是拥有一个具有两个细节的整合数组。示例如下所示。
Date Apple Banana
-------------------------------
1 5 3
3 0 1
4 5 0
5 5 0
7 0 2
考虑到数组可以容纳多个值这一事实,我们能做到最好吗?任何提示都会帮助我解决这个问题。或者如果已经讨论过,请指出我正确的链接。我在搜索过程中找不到任何东西。
提前致谢。
答案 0 :(得分:1)
我想出的最好的事情就是:
for($i=0; $i<5; $i++){
$t = $i;
$t1 = $t+3;
$te= $i+5;
$ti = $i+10;
$a[] = array(
'date' => $t,
'bannana' => $te,
'tea' => $ti,
);
$b[] = array(
'date' => $t1,
'lemon' => $te,
);
$ar1[]=$a;
$ar2[]=$b;
}
foreach($a as $key=>$value){
foreach($value as $k=>$v){
$ar[$value['date']][$k]=$v;
}
}
foreach($b as $key=>$value){
foreach($value as $k=>$v){
$ar[$value['date']][$k]=$v;
}
}
echo var_dump($ar);
其中$ a和$ b是2个数组,而它们的排序字段是'date'。我查看了堆栈溢出,但是对于这个确切的情况却无法获得另一种解决方案。
这个产生以下var_dump():
array(8) {
[0]=> array(3) {
["date"]=> int(0)
["bannana"]=> int(5)
["tea"]=> int(10)
}
[1]=> array(3) {
["date"]=> int(1)
["bannana"]=> int(6)
["tea"]=> int(11)
}
[2]=> array(3) {
["date"]=> int(2)
["bannana"]=> int(7)
["tea"]=> int(12)
}
[3]=> array(4) {
["date"]=> int(3)
["bannana"]=> int(8)
["tea"]=> int(13)
["lemon"]=> int(5)
}
[4]=> array(4) {
["date"]=> int(4)
["bannana"]=> int(9)
["tea"]=> int(14)
["lemon"]=> int(6)
}
[5]=> array(2) {
["date"]=> int(5)
["lemon"]=> int(7)
}
[6]=> array(2) {
["date"]=> int(6)
["lemon"]=> int(8)
}
[7]=> array(2) {
["date"]=> int(7)
["lemon"]=> int(9)
}
}
答案 1 :(得分:0)
使用for循环,您可以遍历要添加的数组,在主表中查找现有的“Date”条目,或者创建一个与要添加的数组的当前“Date”值匹配的新条目。如果主表中的条目数据需要它没有的新属性类型(例如Apple,Banana),则将其添加到数据中。我还建议您使用'Date'作为数组键,以这种方式快速查找匹配将更容易:
foreach ($appleArray as $value) {
$date = $value['date'];
if (isset($masterArray[$date])) {
// Goes here if the date exists in the master array already.
// In this case, we just append to our data the fields
// found in the $value.
foreach ($value as $subKey => $subValue) {
// Iterate through each value, skip our 'date' key, and append
// each other item to our master array.
if ($subKey != 'date') {
$masterArray[$date][$subKey] = $subValue;
}
}
} else {
// Goes here if the date isn't in the master array yet.
// In this case, create a new entry and just copy the data.
$masterArray[$date] = $value;
}
}
在这个系统中,当一个日期条目包含一个苹果但不包含香蕉等时,会丢失字段。在这些情况下,您可以假设这些值为0,或者遍历整个列表并添加'手动香蕉田。
答案 2 :(得分:0)
基于@Hristo响应,我修改了代码,它按以下方式工作。通过这种方式,我得到了预期的输出。
下面不是我使用的确切代码。我已修改为与问题中发布的示例保持一致。
这会在一个巨大的阵列中运作良好吗?
$finalArray = array();
foreach ($apple as $key => $value) {
$finalArray[$value['date']]['apple'] = $value['apple'];
}
foreach ($banana as $key => $value) {
$finalArray[$value['date']]['banana'] = $value['banana'];
}
var_dump($finalArray);
这给出了
的输出 array
(
[1] => array
(
[apple] => 5
[banana] => 3
)
)