Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:自动完成时间间隔_Php_Arrays - Fatal编程技术网

PHP:自动完成时间间隔

PHP:自动完成时间间隔,php,arrays,Php,Arrays,因此,我有一个具有以下结构值的数组: $values = array( "2012-01-01 00:15:00" => "0.01", "2012-01-01 00:30:00" => "0.34", "2012-01-01 00:45:00" => "0.51", ); 如您所见,值之间的间隔为15分钟。有时我会得到缺少的值,例如: $values = array( "2012-01-01 00:15:00" => "0.01",

因此,我有一个具有以下结构值的数组:

$values = array(
    "2012-01-01 00:15:00" => "0.01",
    "2012-01-01 00:30:00" => "0.34",
    "2012-01-01 00:45:00" => "0.51",
);
如您所见,值之间的间隔为15分钟。有时我会得到缺少的值,例如:

$values = array(
    "2012-01-01 00:15:00" => "0.01",
    "2012-01-01 00:30:00" => "0.34",
    "2012-01-01 01:01:00" => "0.23",
);
以正确的顺序在数组中添加缺少的
“2012-01-01 00:45:00”
,并添加标准值(如“0.00”)的最佳方法是什么(CPU密集度较低)


谢谢。

下面的代码应该可以填补空白,如果您预计空白会超过30分钟,我可以稍微扩展一下

<?php
date_default_timezone_set('GMT');

$values = array(
    "2012-01-01 00:15:00" => "0.01",
    "2012-01-01 00:30:00" => "0.34",
    "2012-01-01 01:31:00" => "0.23",
    "2012-01-01 05:31:00" => "0.23",
    "2012-01-02 01:31:00" => "0.23",
);

function process_values($values) {
    $keys = array_keys($values);

    $new_values = array();

    $new_values[$keys[0]] = $values[$keys[0]];

    for($i = 1; $i < count($keys); $i++) {
        $timestamp = strtotime($keys[$i]);

        $minute_difference = ($timestamp - strtotime($keys[$i - 1])) / 60;

        $start_minutes = floor(date('i', strtotime($keys[$i - 1])) / 15) * 15;

        for($k = 1; $k < floor($minute_difference / 15); $k++) {
            $minutes = $start_minutes + $k * 15;

            $formatted_date = date('Y-m-d H:' . str_pad($minutes % 60, 2, '0') . ':00', strtotime($keys[$i - 1]) + floor($minutes / 60) * 3600);

            $new_values[$formatted_date] = '0.00';
        }

        $new_values[$keys[$i]] = $values[$keys[$i]];
    }

    return $new_values;
}

print_r(process_values($values));

这是你的答案,我已经测试过了,效果很好:

<?php
$values = array(
  "2012-01-01 00:15:00" => "0.01",
  "2012-01-01 00:30:00" => "0.34",
  "2012-01-01 01:00:00" => "0.23",
);
$values2 = array();
$passFirst = 0;
$difference = 60*15;
foreach ($values as $k => $v) {
  $tempTime = date('Y-m-d H:i:s', strtotime($k) -$difference);
  if (!isset($values[$tempTime]) && $passFirst) {
    $values2[$tempTime] = '0.00';
  }
  $values2[$k] = $v;
  $passFirst = 1;
}
/* The next two lines are for debugging, remove or comment after that */
print('<pre>');
print_r($values2);

您能否先单独构建一个完整的日期数组,然后将其与上面的
$values
数组中的键进行比较?请注意,我认为另一个解决方案只能以精确的15分钟增量工作,这就是他更改您最初提供的时间戳的原因是的,我注意到了“01:00:00”时间,但您的解决方案也会输出
[2012-01-01 01:60:00]=>0[2012-01-01 01:45:00]=>0.43[2012-01-01 04:180:00]=>0
。谢谢。那真是太棒了。。。我已经更新了代码以使其正常工作,它甚至会在几天内失效,如提供的时间戳所示。只要试着运行代码,就会看到结果:)