Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-按命名键向下合并多维数组_Php_Arrays_Join_Merge_Multidimensional Array - Fatal编程技术网

PHP-按命名键向下合并多维数组

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] =>

我有以下数组(它包含多个数据库查询的结果——在示例中只有2个,但可以更多)。 合并需要由指定的列(在本例中为日期列)完成。我们将其称为merge\u by

 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比较需要是一个或一个。。。当他们有不同数量的结果时不起作用。如果一组在另一组结束后开始,这也会导致问题。但我认为情况并非如此。