【问题标题】:PHP - Merge-down multidimensional arrays by named keyPHP - 通过命名键合并多维数组
【发布时间】:2011-06-12 12:11:37
【问题描述】:

我有以下数组(其中包含多个数据库查询的结果 - 在示例中只有 2 个,但可以更多。 合并需要由指定的列(在本例中为 date 列)完成。我们将此称为 merge_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 在要合并的数组中不会有相同的值
  • 2 个查询中的结果数量会有所不同,并且 merge_by 值可能会有所不同,因此可能会遇到
    $arr[0][1][date] != $arr[1][1][date]
  • LE:除了 merge_by 列之外,所有其他列都将彼此不同,因此您不会有 $arr[0][0][col-2]$arr[1][0][col-2]

所以这样做的目的是将某些查询的列合并为一个公共列。
来自太多数据库的太多数据来自太多列,无法仅从 SQL 中获取。我知道...预先计算值 :) ...现在不是一个选项。

当列数和这些索引匹配时,我已设法使其工作。从那以后尝试了很多选择,所以现在我有一个不值得作为示例添加的版本。

那么有人知道可以实现上述功能的功能吗?

谢谢

【问题讨论】:

    标签: php arrays join merge multidimensional-array


    【解决方案1】:

    首先,我将假设您的数据按日期排序,因为您可以在 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 数组应该有你想要的了。请注意,此解决方案假定您在一个块中没有重复的日期行,否则它将覆盖现有结果。此外,如果需要,您可以扩展为拥有两个以上的数据集。

    【讨论】:

    • 非常感谢。对于可能实现它的其他人来说,很少有 cmets:在设置 $diff var 值之后,还需要增加 $i_first 和 $i_second;我在做 $merged[] = (array)$data[0][$i_first];和第二个类似; $data 有 3 个维度,因此其中一个还必须包含上面写的另一个索引;对于一般字符串,我将 diff 设置为 strcmp 比较。稍后查看如何使其获得超过 2 个结果...应该不会那么难。
    • 哦,同时比较需要是一个 OR ......当他们有不同数量的结果时不起作用
    • 如果一组在另一组结束后开始,也会导致问题。但我认为情况并非如此。
    猜你喜欢
    • 2014-02-11
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2014-12-11
    • 2021-05-25
    相关资源
    最近更新 更多