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 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器