PHP-按命名键向下合并多维数组
我有以下数组(它包含多个数据库查询的结果——在示例中只有2个,但可以更多)。 合并需要由指定的列(在本例中为日期列)完成。我们将其称为merge\u by列PHP-按命名键向下合并多维数组,php,arrays,join,merge,multidimensional-array,Php,Arrays,Join,Merge,Multidimensional Array,我有以下数组(它包含多个数据库查询的结果——在示例中只有2个,但可以更多)。 合并需要由指定的列(在本例中为日期列)完成。我们将其称为merge\u by列 Array ( [0] => Array ( [0] => Array ( [date] => 2011-01-17 [col-1] => 58 [col-2] =>
Array
(
[0] => Array
(
[0] => Array
(
[date] => 2011-01-17
[col-1] => 58
[col-2] => 54
)
[1] => Array
(
[date] => 2011-01-19
[col-1] => 50
[col-2] => 61
)
[2] => Array
(
[date] => 2011-01-20
[col-1] => 44
[col-2] => 22
)
[3] => Array
(
[date] =>
[col-1] => 448
[col-2] => 196
)
[1] => Array
(
[0] => Array
(
[date] => 2011-01-17
[col-3] => 1489
)
[1] => Array
(
[date] => 2011-01-18
[col-3] => 1534
)
[2] => Array
(
[date] =>
[col-3] => 1534
)
)
)
我正在努力实现这一目标
Array
(
[0] => Array
(
[date] => 2011-01-17
[col-1] => 58
[col-2] => 54
[col-3] => 1489
)
[1] => Array
(
[date] => 2011-01-18
[col-1] =>
[col-2] =>
[col-3] => 1534
)
[2] => Array
(
[date] => 2011-01-19
[col-1] => 50
[col-2] => 61
[col-3] =>
)
[3] => Array
(
[date] => 2011-01-20
[col-1] => 44
[col-2] => 22
[col-3] =>
)
[4] => Array
(
[date] =>
[col-1] => 448
[col-2] => 196
[col-3] => 1534
)
需要考虑的事项:
- merge_by可以接受null或空字符串值
- merge_by在要合并的数组中不具有相同的值
- 这两个查询中的结果数量将不同,并且merge_by值可能不同,因此可能会遇到
$arr[0][1][date]!=$arr[1][1][date]
- LE:除了merge_by column之外,所有其他列都会彼此不同,因此您没有
和$arr[0][0][col-2]
$arr[1][0][col-2]
来自太多数据库和太多列的数据太多,无法仅从SQL生成。我知道…预计算值:)。。。现在没有选择 当这些列的数量和索引匹配时,我已经设法使它工作。从那时起,我尝试了许多选择,所以现在我有一个版本不值得添加它作为例子 那么,有人知道一个函数可以实现上述功能吗
谢谢首先,我假设您的数据是按日期排序的,因为您可以在SQL中进行排序,并且在您的示例中进行排序。您需要同时遍历所有集合,边走边合并
$merged = array();
$i_first = 0;
$i_second = 0;
$count_first = count($data[0]);
$cound_second = count($data[1]);
while ($i_first < $count_first || $i_second < $count_second)
{
// this comparison depends on what your merge_by is
$diff = strtotime($data[$i_first]['date']) - strtotime($data[$i_second]['date']);
if ($diff == 0)
{
$merged[] = array_merge($data[$i_first], $data[$i_second]);
$i_first++;
$i_second++;
}
elseif ($diff < 0) // first date is earlier
{
$i_first++;
}
else // second date earlier
{
$i_second++;
}
}
$merged=array();
$i_first=0;
$i_秒=0;
$count_first=count($data[0]);
$cound_second=计数($data[1]);
而($i_first<$count_first |$i_second<$count_second)
{
//这种比较取决于合并的依据
$diff=strotime($data[$i_first]['date'])-strotime($data[$i_second]['date']);
如果($diff==0)
{
$merged[]=array\u merge($data[$i\u first],$data[$i\u second]);
$i_first++;
$i_秒++;
}
elseif($diff<0)//第一个日期更早
{
$i_first++;
}
否则//第二次约会早一点
{
$i_秒++;
}
}
现在,您的$merged数组应该有您想要的。请注意,此解决方案假定一个数据块中没有重复的日期行,否则将覆盖现有结果。此外,如果需要,您可以扩展到两个以上的数据集。非常有用。对其他可能实现它的人没有什么意见:在设置$diff var值之后,需要先增加$i_,再增加$i_;我正在做$merged[]=(数组)$data[0][$I_first];第二种情况类似$数据有3个维度,因此其中一个维度还必须包括上面所述的其他索引;对于一般字符串,我将diff作为strcmp比较。稍后查看如何获得2个以上的结果…应该没那么难。哦,而且while比较需要是一个或一个。。。当他们有不同数量的结果时不起作用。如果一组在另一组结束后开始,这也会导致问题。但我认为情况并非如此。