【问题标题】:How do I merge data into Multidimentional array based on a value in current/previous array如何根据当前/上一个数组中的值将数据合并到多维数组中
【发布时间】:2015-02-04 08:51:05
【问题描述】:

我正在构建一些电话统计信息,并在下面有输出,我需要基本上合并相同的 src 并将持续时间加在一起。例如,数组索引 0 到 6 将合并为一个数组,如下所示:

[0] => Array ( [calldate] => 2014-12-01 08:31:47 [src] => 1234 [duration] => 190 )

您可能在想它不应该是索引 0 到 8,但因为索引 6 只有 10 秒,这基本上表示呼叫已被应答。可以假设,如果一个通话时长是 30 秒,那么它就没有被接听。

这并不像在数组中找到匹配的 src 并将所有持续时间加在一起那么简单,尽管您将在 index 11 9123 中看到调用并在 12 秒内得到答复,但他们在大约 30 分钟后回电并且他们在9:55:31 的第二次呼叫在 15 秒内得到应答,这需要将最终数组中的项目分开。

src 只是虚构的,不会是现实世界中的数字。

Array ( 

    [0] => Array ( [calldate] => 2014-12-01 08:31:47 [src] => 1234 [duration] => 30 ) 
    [1] => Array ( [calldate] => 2014-12-01 08:32:22 [src] => 1234 [duration] => 30 ) 
    [2] => Array ( [calldate] => 2014-12-01 08:32:57 [src] => 1234 [duration] => 30 ) 
    [3] => Array ( [calldate] => 2014-12-01 08:33:32 [src] => 1234 [duration] => 30 ) 
    [4] => Array ( [calldate] => 2014-12-01 08:34:07 [src] => 1234 [duration] => 30 ) 
    [5] => Array ( [calldate] => 2014-12-01 08:34:42 [src] => 1234 [duration] => 30 ) 
    [6] => Array ( [calldate] => 2014-12-01 08:35:12 [src] => 1234 [duration] => 10 ) 
    [7] => Array ( [calldate] => 2014-12-01 08:35:47 [src] => 1234 [duration] => 30 ) 
    [8] => Array ( [calldate] => 2014-12-01 08:36:22 [src] => 1234 [duration] => 30 ) 
    [9] => Array ( [calldate] => 2014-12-01 08:51:20 [src] => 5678 [duration] => 15 ) 
    [10] => Array ( [calldate] => 2014-12-01 09:09:14 [src] => 5678 [duration] => 10 ) 
    [11] => Array ( [calldate] => 2014-12-01 09:22:58 [src] => 9123 [duration] => 12 ) 
    [12] => Array ( [calldate] => 2014-12-01 09:42:42 [src] => 4567 [duration] => 30 ) 
    [13] => Array ( [calldate] => 2014-12-01 09:43:17 [src] => 4567 [duration] => 30 ) 
    [14] => Array ( [calldate] => 2014-12-01 09:43:52 [src] => 4567 [duration] => 30 ) 
    [15] => Array ( [calldate] => 2014-12-01 09:44:27 [src] => 4567 [duration] => 30 ) 
    [16] => Array ( [calldate] => 2014-12-01 09:45:02 [src] => 4567 [duration] => 29 ) 
    [17] => Array ( [calldate] => 2014-12-01 09:55:31 [src] => 9123 [duration] => 15 ) 
    [18] => Array ( [calldate] => 2014-12-01 10:34:29 [src] => 8912 [duration] => 10 ) 
    [19] => Array ( [calldate] => 2014-12-01 13:26:29 [src] => 3456 [duration] => 30 ) 
    [20] => Array ( [calldate] => 2014-12-01 13:27:04 [src] => 3456 [duration] => 30 ) 
    [21] => Array ( [calldate] => 2014-12-01 13:27:39 [src] => 3456 [duration] => 30 ) 
    [22] => Array ( [calldate] => 2014-12-01 13:28:14 [src] => 3456 [duration] => 30 ) 
    [23] => Array ( [calldate] => 2014-12-01 13:28:49 [src] => 3456 [duration] => 30 ) 
    [24] => Array ( [calldate] => 2014-12-01 13:29:24 [src] => 3456 [duration] => 30 ) 
    [25] => Array ( [calldate] => 2014-12-01 13:29:54 [src] => 3456 [duration] => 4 ) 
)

我相信这需要某种 for 循环,它必须比较当前/以前的调用并将它们添加到新数组中。我已经这样做了,但它没有给出预期的结果,因为它只会在 src 匹配的情况下将前一个调用和当前调用加在一起。这是我目前拥有的代码:

$adjusted = array();
for($i = 1; $i < sizeof($adjustedTotalCallsExt); $i++) {
$previousCall = $adjustedTotalCallsExt[$i-1];
$currentCall = $adjustedTotalCallsExt[$i];
    if($previousCall['src'] == $currentCall['src']) {
        $adjusted[] = $previousCall['duration'] + $currentCall['duration'];
    }
    else {
    $adjusted[] = $currentCall['duration'];
    }
}     

【问题讨论】:

    标签: php mysql arrays multidimensional-array merge


    【解决方案1】:
    $adjusted = array();
            for($i = 1; $i < sizeof($adjustedTotalCallsExt); $i++) 
            {       
                    $adjusted[$adjustedTotalCallsExt[$i]['src']]['duration']=$adjusted[$adjustedTotalCallsExt[$i]['src']]['duration']+ $adjustedTotalCallsExt[$i]['duration'] ;         
            } 
    

    希望它能满足您的目的。如果它不适合你,请告诉我。

    【讨论】:

    • 我认为您在其中缺少[$i]
    • 是的,你是正确的拉斯克拉特。谢谢指正。
    • 嗨,Tristup,这行得通,但即使它们在不同的时间,它也会总计 src 调用。
    • 我没找到你,艾略特。请告诉我,以便我为您提供帮助。
    【解决方案2】:

    如果您尝试根据不同实例中的应答来分离每个呼叫,PLUS您希望根据每个实例以不同的方式计算同名src,这会将您的数组分解为多个部分基于时间跨度(嗯,不是实时的,只是数组键的差异)。请注意,如果需要,您可以再将其分解一次以隔离每个总实例:

    $calls = array(
                    0 => array('calldate' => '2014-12-01 08:31:47', 'src' => '1234', 'duration' => 30 ),
                    1 => array('calldate' => '2014-12-01 08:32:22', 'src' => '1234', 'duration' => 30 ),
                    2 => array('calldate' => '2014-12-01 08:32:57', 'src' => '1234', 'duration' => 30 ), 
                    3 => array('calldate' => '2014-12-01 08:33:32', 'src' => '1234', 'duration' => 30 ), 
                    4 => array('calldate' => '2014-12-01 08:34:07', 'src' => '1234', 'duration' => 30 ), 
                    5 => array('calldate' => '2014-12-01 08:34:42', 'src' => '1234', 'duration' => 30 ), 
                    6 => array('calldate' => '2014-12-01 08:35:12', 'src' => '1234', 'duration' => 10 ), 
                    7 => array('calldate' => '2014-12-01 08:35:47', 'src' => '1234', 'duration' => 30 ), 
                    8 => array('calldate' => '2014-12-01 08:36:22', 'src' => '1234', 'duration' => 30 ), 
                    9 => array('calldate' => '2014-12-01 08:51:20', 'src' => '5678', 'duration' => 15 ), 
                    10 => array('calldate' => '2014-12-01 09:09:14', 'src' => '5678', 'duration' => 10 ), 
                    11 => array('calldate' => '2014-12-01 09:22:58', 'src' => '9123', 'duration' => 12 ), 
                    12 => array('calldate' => '2014-12-01 09:42:42', 'src' => '4567', 'duration' => 30 ), 
                    13 => array('calldate' => '2014-12-01 09:43:17', 'src' => '4567', 'duration' => 30 ), 
                    14 => array('calldate' => '2014-12-01 09:43:52', 'src' => '4567', 'duration' => 30 ), 
                    15 => array('calldate' => '2014-12-01 09:44:27', 'src' => '4567', 'duration' => 30 ), 
                    16 => array('calldate' => '2014-12-01 09:45:02', 'src' => '4567', 'duration' => 29 ), 
                    17 => array('calldate' => '2014-12-01 09:55:31', 'src' => '9123', 'duration' => 15 ), 
                    18 => array('calldate' => '2014-12-01 10:34:29', 'src' => '8912', 'duration' => 10 ), 
                    19 => array('calldate' => '2014-12-01 13:26:29', 'src' => '3456', 'duration' => 30 ), 
                    20 => array('calldate' => '2014-12-01 13:27:04', 'src' => '3456', 'duration' => 30 ), 
                    21 => array('calldate' => '2014-12-01 13:27:39', 'src' => '3456', 'duration' => 30 ), 
                    22 => array('calldate' => '2014-12-01 13:28:14', 'src' => '3456', 'duration' => 30 ), 
                    23 => array('calldate' => '2014-12-01 13:28:49', 'src' => '3456', 'duration' => 30 ), 
                    24 => array('calldate' => '2014-12-01 13:29:24', 'src' => '3456', 'duration' => 30 ), 
                    25 => array('calldate' => '2014-12-01 13:29:54', 'src' => '3456', 'duration' => 4 ),
                    26 => array('calldate' => '2014-12-01 13:29:54', 'src' => '1234', 'duration' => 30 )
                );
    $i = 0;
    foreach($calls as $row) {
    
            $user[$row['src']][$i]['calls'][]   =   $row['duration'];
            $user[$row['src']][$i]['duration']  =   array_sum($user[$row['src']][$i]['calls']);
    
            if($row['duration'] < 30) {
                    $i++;
                }
        }
    
    echo '<pre>';
    print_r($user);
    

    会给你:

    Array
    (
        [1234] => Array
            (
                [0] => Array
                    (
                        [calls] => Array
                            (
                                [0] => 30
                                [1] => 30
                                [2] => 30
                                [3] => 30
                                [4] => 30
                                [5] => 30
                                [6] => 10
                            )
    
                        [duration] => 190
                    )
    
                [1] => Array
                    (
                        [calls] => Array
                            (
                                [0] => 30
                                [1] => 30
                            )
    
                        [duration] => 60
                    )
    
                [5] => Array
                    (
                        [calls] => Array
                            (
                                [0] => 30
                            )
    
                        [duration] => 30
                    )
    
            )
    
        [5678] => Array
            (
                [1] => Array
                    (
                        [calls] => Array
                            (
                                [0] => 15
                                [1] => 10
                            )
    
                        [duration] => 25
                    )
    
            )
    
        [9123] => Array
            (
                [2] => Array
                    (
                        [calls] => Array
                            (
                                [0] => 12
                            )
    
                        [duration] => 12
                    )
    
                [3] => Array
                    (
                        [calls] => Array
                            (
                                [0] => 15
                            )
    
                        [duration] => 15
                    )
    
            )
    
        [4567] => Array
            (
                [3] => Array
                    (
                        [calls] => Array
                            (
                                [0] => 30
                                [1] => 30
                                [2] => 30
                                [3] => 30
                                [4] => 29
                            )
    
                        [duration] => 149
                    )
    
            )
    
        [8912] => Array
            (
                [3] => Array
                    (
                        [calls] => Array
                            (
                                [0] => 10
                            )
    
                        [duration] => 10
                    )
    
            )
    
        [3456] => Array
            (
                [4] => Array
                    (
                        [calls] => Array
                            (
                                [0] => 30
                                [1] => 30
                                [2] => 30
                                [3] => 30
                                [4] => 30
                                [5] => 30
                                [6] => 4
                            )
    
                        [duration] => 184
                    )
    
            )
    
    )
    

    【讨论】:

    • Rasclatts 您的回答将不同时间的不同呼叫分开,这正是我所需要的。现在我将构建另一个 for 循环来遍历新数组以查找持续时间低于 30/60 秒的调用。我在 If 语句中修改了 Rasclatts 代码,使持续时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2023-04-03
    • 2019-03-14
    • 2017-07-08
    • 2022-01-01
    • 2023-03-28
    相关资源
    最近更新 更多