为了账号安全,请及时绑定邮箱和手机立即绑定

php数组内部上下合并 以及去重复,哪位有更好更快的办法?

php数组内部上下合并 以及去重复,哪位有更好更快的办法?

PHP
慕标5832272 2019-03-15 14:22:25
现有数据结构 [ { "checktime": "2017-06-01 10:47:46" }, { "checktime": "2017-06-01 20:57:17" }, { "checktime": "2017-06-02 15:15:45" }, { "checktime": "2017-06-02 22:33:11" }, { "checktime": "2017-06-02 22:43:54" }, { "checktime": "2017-06-03 07:37:42" }, { "checktime": "2017-06-03 20:02:47" }, { "checktime": "2017-06-04 07:43:40" }, { "checktime": "2017-06-06 07:44:25" }, { "checktime": "2017-06-06 23:51:53" } ] 理想数据结构 [ { "start": "2017-06-01 10:47:46", "end": "2017-06-01 20:57:17" }, { "start": "2017-06-02 15:15:45", "end": "2017-06-02 22:43:54" }, { "start": "2017-06-03 07:37:42", "end": "2017-06-03 20:02:47" }, { "start": "2017-06-04 07:43:40" }, { "start": "2017-06-06 07:44:25", "end": "2017-06-06 23:51:53" }, ]
查看完整描述

2 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

<?php

$output = [];
$i = -1;
$last = '';
$start = true;

foreach ($input as $key => $val) {
    list ($current) = explode(' ', $val['checktime']);
    
    if ($current != $last) {
        $i ++;
        $last = $current;
        $start = true;
    } else {
        $start = false;
    }
    
    $output[$i][$start ? 'start' : 'end'] = $val['checktime'];
}
查看完整回答
反对 回复 2019-03-18
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

看了你的问题,先指出一个问题,键相同会导致数据覆盖,所以你的理想数据结构有一定问题。

问题主要想解决,按日期归类,记录每天的最大值和最小值

我的方案比较笨,一次循环搞定,假设数据格式都如上那么规整

// 查询结果,如问题内的结构
$list = [];
// 定义变量
$data = [];
// 进行数据循环
foreach ($list as $value) {
    // 转换为时间戳
    $tempTime = strtotime($value['checktime']);
    // 获取日期
    $key = date('Ymd', $tempTime);
    // 按日期开辟数据键
    isset($data[$key]) || $data[$key] = ['min' => '', 'max' => ''];
    // 判断最小数是否为空,为空则直接赋值
    if (empty($data[$key]['min'])) {
        $data[$key]['min'] = $value['checktime'];
    } else {
        $value['checktime'] < $data[$key]['min'] && $data[$key]['min'] = $value['checktime'];
    }
    // 判断最大数是否为空,为空则直接赋值
    if (empty($data[$key]['max'])) {
        $data[$key]['max'] = $value['checktime'];
    } else {
        $value['checktime'] > $data[$key]['max'] && $data[$key]['max'] = $value['checktime'];
    }
}
// 此时的data可能就是你想要的了

注:字符串也可比大小,按字符从左到右逐一比较,比较ASCII码大小

查看完整回答
反对 回复 2019-03-18
  • 2 回答
  • 0 关注
  • 613 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信