$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的时间。循环该怎么写,求助大神。
2 回答
蝴蝶不菲
TA贡献1810条经验 获得超4个赞
从你这段数组上感觉你对于通话时长,这段业务处理的很奇怪(指的是数组的形成方式)。通过下面的代码应该可以得到你想要的结果:$true_key=null;$times=[];foreach($arras$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;}}
扬帆大鱼
TA贡献1799条经验 获得超9个赞
先把true和false拆开放在两组。然后遍历为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($arras$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);
添加回答
举报
0/150
提交
取消
