【问题标题】:grouping an array by datetime and select max datetime from it按日期时间对数组进行分组并从中选择最大日期时间
【发布时间】:2017-09-19 07:44:49
【问题描述】:

我的查询是

   $fuel_histories = FuelHistory::where('device_id',$Device->id)
           ->where('when','<',$to_date)
           ->where('when','>',$from_date)
           ->select('when','value')
           ->orderBy('when','asc')->get();



     $data = [];
     $dates=[];

     foreach($fuel_histories as $key=>$value):
       $data[$value->when->toDateTimeString()]= $value->value;
     endforeach;

我有一个这样的数组,其中键是日期时间,值是数字

[2017-09-17 19:53:24] => 6
[2017-09-18 11:53:15] => 1.212
[2017-09-18 11:54:25] => 1.212
[2017-09-18 12:07:40] => 1.212
[2017-09-18 12:07:58] => 8
[2017-09-18 12:25:09] => 12
[2017-09-18 12:25:56] => 19
[2017-09-18 12:37:25] => 17
[2017-09-19 19:54:47] => 1
[2017-09-22 19:54:36] => 2

在这里,我有多个时间不同但日期相同的键。 如果某些键具有相同的日期和时间是 24 小时格式,我需要最新的日期时间。所以日期相同的键是

[2017-09-18 11:53:15] => 1.212
[2017-09-18 11:54:25] => 1.212
[2017-09-18 12:07:40] => 1.212
[2017-09-18 12:07:58] => 8
[2017-09-18 12:25:09] => 12
[2017-09-18 12:25:56] => 19
[2017-09-18 12:37:25] => 17

最大时间是

12:37:25

所以我需要一对是

[2017-09-18 12:37:25] => 17

最后我的预期输出是

 [2017-09-17 19:53:24] => 6
 [2017-09-18 12:37:25] => 17
 [2017-09-19 19:54:47] => 1
 [2017-09-22 19:54:36] => 2

【问题讨论】:

  • 你已经尝试过什么?你的 PHP 代码在哪里?
  • 我在查询和过滤后得到了这个数组,现在我正在寻求帮助以获得我的预期结果,我已经尝试过时间戳没有运气@JustBaron
  • 好吧,您可以创建一个多维数组(日期、时间、值),然后按日期排序,然后按时间排序。或者在添加到现有数组之前检查最新时间。
  • 请您删除否决票:3

标签: php arrays laravel datetime


【解决方案1】:
$arr = [
    '2017-09-17 19:53:24' => 6,
    '2017-09-18 11:53:15' => 1.212,
    '2017-09-18 11:54:25' => 1.212,
    '2017-09-18 12:07:40' => 1.212,
    '2017-09-18 12:07:58' => 8,
    '2017-09-18 12:25:09' => 12,
    '2017-09-18 12:25:56' => 19,
    '2017-09-18 12:37:25' => 17,
    '2017-09-19 19:54:47' => 1,
    '2017-09-22 19:54:36' => 2
];

$dates = [];
$times = [];
$result = [];

foreach ($arr as $key => $val) {
    $dt = explode(' ', $key);
    if (!in_array($dt[0], $dates)) $dates[] = $dt[0];
    if (!isset($times[$dt[0]]) || strtotime($times[$dt[0]]) < strtotime($dt[1])) {
        $times[$dt[0]] = $dt[1];
    }
}

foreach ($dates as $val) {
    $key = "{$val} {$times[$val]}";
    $result[$key] = $arr[$key];
}

print_r($result);

附:正如 JustBaron 所说,您最好在添加对之前检查最新时间。

【讨论】:

    【解决方案2】:

    试试这个:

    $prevDate = "";
    $prevTime = "";
    $result = [];
    foreach($data as $key => $val){
        list($date,$time) = explode(' ', $key);
        if($date == $prevDate){
            $prevTime = $time;
            continue;
        }
        else if($prevDate !== "") {
            array_pop($result);
            $result[$prevDate." ".$prevTime] = $data[$prevDate." ".$prevTime];
        }
    
        $prevTime = $time;
        $prevDate = $date;
        $result[$key] = $val; 
    }
    
    print_r($result);
    

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      相关资源
      最近更新 更多