php 二维数组 怎么获取不同值对应的时间差

zhai斋
  • 95
$arr=[
'0' =>['a1' => 'true','time' => 1537861731],
'1' =>['a1' => 'false','time' => 1541035671],
'2' =>['a1' => 'true','time' => 1541036000],
'3' =>['a1' => 'true','time' => 1541036010]
'4' =>['a1' => 'false','time' => 1541036020]
 ];
 
 true:接通;
 
 false:未接通;
 
 true到false的时间是接通时间;
 false到true的是未接通时间;
 
 
 
 结果:想获取所有的接通时间。
 
 就是用false对应的时间戳减去前面的为true的时间戳。
 
 这个试例中的就只能 用1减去0的时间,4减去2的时间。
 
 
 循环该怎么写,求助大神。
回复
阅读 1.1k
2 个回答

从你这段数组上感觉你对于通话时长,这段业务处理的很奇怪(指的是数组的形成方式)。
通过下面的代码应该可以得到你想要的结果:

$true_key = null;
$times = [];
foreach ($arr as $key => $value) {

    if ($value['a1'] == 'true') {
        // 记录true第一次出现时的下标
        if ($true_key === null) {
            $true_key = $key;
        }
        continue;
    }

    /**
     * 记录
     */
    if (($value['a1'] == 'false') && ($true_key !== null)) {
        $times[]  = $value['time'] - $arr[$true_key]['time'];
        $true_key = null;
    }
}

先把 truefalse 拆开放在 两组
然后遍历 为 true 的一组。并同时对为 false 的一组进行迭代。
每次迭代对 游标向前推进 如果当前的结束时间不为 null 就用结束时间减去开始时间,即为本次连接时间。

$arr=[
    ['a1' => 'true','time' => 1537861731],
    ['a1' => 'false','time' => 1541035671],
    ['a1' => 'true','time' => 1541036000],
    ['a1' => 'true','time' => 1541036010],
    ['a1' => 'false','time' => 1541036020]
 ];

$start = [];
$finish = [];
foreach ($arr as $item) {
    if($item['a1']==='true'){
        array_push($start,$item);
        continue;
    }
    array_push($finish,$item);
}

$result = array_map(function($item)use(&$finish){
    $current = current($finish);
    next($finish);
    if($current){
        return $current['time'] - $item['time'];
    }
},$start);

var_dump($result);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏