multidimentional数组中的用户计数

时间:2018-02-23 07:23:11

标签: php arrays multidimensional-array

我的数组如下所示。我想为用户提供一些聊天功能。

并且还要从状态

计算低于3个细节
  1. close_chat
  2. open_chat
  3. 总聊天。

    Array
        (
           [0] => Array
                (
                    [id] => pZgauDZtvQ9grRD9c
                    [rid] => obHEGwnrfHKCd32jF
                    [starttime] => 14-02-2018
                    [chatduration] => 124.502
                    [username] => bhavin
                    [status] => open
                )
    
            [1] => Array
                (
                    [id] => ej5WfYe3dn8mtHzQF
                    [rid] => o6pKCt4e6RaYiZhQ8
                    [starttime] => 14-02-2018
                    [chatduration] => 1072.628
                    [username] => bhavin
                    [status] => closed
                )                                                        
    
            [2] => Array
                (
                    [id] => qCzZjf7vb4rSBRndk
                    [rid] => ZFvuuFiL9RFiemX3K
                    [starttime] => 14-02-2018
                    [chatduration] => 11.254
                    [username] => lokesh
                    [status] => closed
                )
    
            [3] => Array
                (
                    [id] => TCdSycFFSeY8WaKzG
                    [rid] => f7ADPWFsCD6RZFspk
                    [starttime] => 14-02-2018
                    [chatduration] => 121.228
                    [username] => lokesh
                    [status] => closed
                )
    
        )
    

    从这个数组我想用userwise进行sum chatduration。 bhavin用户和lokesh用户的总和应存储在数组中。

  4. 这怎么可能?

4 个答案:

答案 0 :(得分:1)

喜欢这样吗?

$array = unserialize( 'a:4:{i:0;a:6:{s:2:"id";s:17:"pZgauDZtvQ9grRD9c";s:3:"rid";s:17:"obHEGwnrfHKCd32jF";s:9:"starttime";s:10:"14-02-2018";s:12:"chatduration";s:7:"124.502";s:8:"username";s:6:"bhavin";s:6:"status";s:4:"open";}i:1;a:6:{s:2:"id";s:17:"ej5WfYe3dn8mtHzQF";s:3:"rid";s:17:"o6pKCt4e6RaYiZhQ8";s:9:"starttime";s:10:"14-02-2018";s:12:"chatduration";s:8:"1072.628";s:8:"username";s:6:"bhavin";s:6:"status";s:6:"closed";}i:2;a:6:{s:2:"id";s:17:"qCzZjf7vb4rSBRndk";s:3:"rid";s:17:"ZFvuuFiL9RFiemX3K";s:9:"starttime";s:10:"14-02-2018";s:12:"chatduration";s:6:"11.254";s:8:"username";s:6:"lokesh";s:6:"status";s:6:"closed";}i:3;a:6:{s:2:"id";s:17:"TCdSycFFSeY8WaKzG";s:3:"rid";s:17:"f7ADPWFsCD6RZFspk";s:9:"starttime";s:10:"14-02-2018";s:12:"chatduration";s:7:"121.228";s:8:"username";s:6:"lokesh";s:6:"status";s:6:"closed";}}' );


$new_array['open_chats'] = $new_array['closed_chats'] = $new_array['total_chats'] = 0;

foreach( $array as $chat ){

    if( $chat['status']  === 'open')

        $new_array['open_chats']++;

    if( $chat['status'] === 'closed' )

        $new_array['closed_chats']++;


    @$new_array['chat_duration_by_user'][ $chat['username'] ] += $chat['chatduration'];

    $new_array['total_chats']++;

}


print_r( $new_array );

<强>输出

Array
(
    [total_chats] => 4
    [closed_chats] => 3
    [open_chats] => 1
    [chat_duration_by_user] => Array
        (
            [bhavin] => 1197.13
            [lokesh] => 132.482
        )

)

答案 1 :(得分:0)

您可以将聊天时间总和如下:

$duration = array_sum(array_column($userArray,'chatduration'));

你可以得到这样的计数:

$counts = array_count_values(array_column($userArray,'status'));

最后一个将返回一个数组,使用数组的值作为键,并将它们在数组中的频率作为值。

答案 2 :(得分:0)

Demo

我编写了一个算法,用户计算总聊天时间,请参阅演示,这里是代码

$user = [];

foreach($arr as $record){

    if (array_key_exists($record['username'],$user))
  {
        $user[$record['username']] = $user[$record['username']] + $record['chatduration'];
        echo "inside";
  }
else
  {
      $user[$record['username']]  = $record['chatduration'];
  }
}

输出:

Array(
[bhavin] => 249.004
 )

答案 3 :(得分:0)

您可以在这样的foreach循环中使用array_columnarray_count_valuesarray_sum来获取我认为易于使用的结果数组。

注意我是如何首先创建输入数组的关联数组,以便更容易创建结果数组 关联数组意味着我将获得[user] [index] [status]。例如 这样我就可以轻松地使用array_sum和array_count_values来获得我需要的东西。

$arr = Array(
   "0" => Array
        (
            "id" => "pZgauDZtvQ9grRD9c",
            "rid" => "obHEGwnrfHKCd32jF",
            "starttime" => "14-02-2018",
            "chatduration" => 124.502,
            "username" => "bhavin",
            "status" => "open"
        ),

    "1" => Array
        (
            "id" => "ej5WfYe3dn8mtHzQF",
            "rid" => "o6pKCt4e6RaYiZhQ8",
            "starttime" => "14-02-2018",
            "chatduration" => 1072.628,
            "username" => "bhavin",
            "status" => "closed"
        ),                                                        

    "2" => Array
        (
            "id" => "qCzZjf7vb4rSBRndk",
            "rid" => "ZFvuuFiL9RFiemX3K",
            "starttime" => "14-02-2018",
            "chatduration" => 11.254,
            "username" => "lokesh",
            "status" => "closed"
        ),

    "3" => Array
        (
            "id" => "TCdSycFFSeY8WaKzG",
            "rid" => "f7ADPWFsCD6RZFspk",
            "starttime" => "14-02-2018",
            "chatduration" => 121.228,
            "username" => "lokesh",
            "status" => "closed"
        )
);
// create new associative array
foreach($arr as $subarr){ 
    $new[$subarr["username"]][] = $subarr; 
}
// loop each username and create result array 
foreach($new as $user => $subarr){
    $result[$user]["duration"] = array_sum(array_column($subarr, "chatduration")); 
    // @ to supress notice if no open/closed is in array
    @$result[$user]["open"] = array_count_values(array_column($subarr, "status"))["open"]; 
    @$result[$user]["closed"] = array_count_values(array_column($subarr, "status"))["closed"];
}
$result["total"]["duration"] = array_sum(array_column($result, "duration"));
$result["total"]["open"] = array_sum(array_column($result, "open"));
$result["total"]["closed"] = array_sum(array_column($result, "closed"));
var_dump($result);

https://3v4l.org/UJn3G

输出:

array(3) {
      ["bhavin"]=> array(3) {
            ["duration"]=> 1197.13
            ["open"]=> 1
            ["closed"]=> 1
      }
      ["lokesh"]=> array(3) {
            ["duration"]=> 132.482
            ["open"]=> NULL
            ["closed"]=> 2
      }
      ["total"]=> array(3) {
            ["duration"]=> 1329.612
            ["open"]=> 1
            ["closed"] => 3
      }
}