dongya0914 2014-12-06 05:10
浏览 30
已采纳

如何根据当前/上一个数组中的值将数据合并到多维数组中

I am building some phone statistics and have the output below which I need to basically merge the same src and add the duration together. For example array index 0 through to 6 would merge into one array that would look like the following:

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

You're probably thinking shouldn't it be index 0 through to 8 but because index 6 was only 10 seconds this basically signifies that the call was answered. It can be assumed that if a call duration is 30 seconds then it has not been answered.

It's not as simple as just finding the src that match in the array and adding all the durations together though as you will see in index 11 9123 calls and is answered within 12 seconds but they call back around 30 minutes later and their second call at 9:55:31 is answered within 15 seconds, this would need to be to separate items in the final array.

The src's are just fictional and will not be the numbers in the real world.

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 ) 
)

I believe this would need to be some sort of for loop that would have to compare current/previous calls and add them into a new array. I have done this but it isn't giving the expected result as it only adds together the previous and current call if the src matches. Here is the code I currently have:

$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'];
    }
}     
  • 写回答

2条回答 默认 最新

  • doujianguang5506 2014-12-06 06:49
    关注

    If you are trying to separate out each call based on answered in separate instances, PLUS you want to count same named src differently based on each instance, this will break your array down into sections based on spans of time (well, not real time, just the array key differences). Note, you can break this down one more time to just isolate each instance of total if you want:

    $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);
    

    WILL GIVE YOU:

    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
                    )
    
            )
    
    )
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 ROS Turtlebot3 多机协同自主探索环境时遇到的多机任务分配问题,explore节点
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题