使用前一天的值填充缺少数组的日期

时间:2017-01-05 09:35:36

标签: php

我有一个数据库生成的数组,显示库存产品的连续日期范围。

我遇到的问题是,当缺少日期时,日期范围会被分成两部分,如下面数组的一段所示,其中没有第31页的记录。

我可以说它是一个缺少的日期,因为缺失日期之前的行中的元素[0],[1],[2]等于元素[0],[1],[2]中的元素丢失日期后排。元素[3]是[4],[5]日期范围内的天数。

[20] => Array ( [0] => 745637 [1] => 24759 [2] => 6.00 [3] => 23 [4] => 2016-12-08 [5] => 2016-12-30 ) 
[21] => Array ( [0] => 745637 [1] => 24759 [2] => 6.00 [3] => 2 [4] => 2017-01-01 [5] => 2017-01-02 ) 
[22] => Array ( [0] => 745637 [1] => 26400 [2] => 5.70 [3] => 23 [4] => 2016-12-08 [5] => 2016-12-30 ) 
[23] => Array ( [0] => 745637 [1] => 26400 [2] => 5.70 [3] => 2 [4] => 2017-01-01 [5] => 2017-01-02 ) 
[24] => Array ( [0] => 745637 [1] => 29882 [2] => 7.00 [3] => 23 [4] => 2016-12-08 [5] => 2016-12-30 ) 
[25] => Array ( [0] => 745637 [1] => 29882 [2] => 7.00 [3] => 2 [4] => 2017-01-01 [5] => 2017-01-02 )

所以我想要做的是合并这些行如果只有1天的间隙AND元素[0],[1],[2]在缺失日期之前的行中等于元素[0] ,[1],[2]在失踪日期之后。

[20] => Array ( [0] => 745637 [1] => 24759 [2] => 6.00 [3] => 23 [4] => 2016-12-08 [5] => 2016-12-30 ) 
[21] => Array ( [0] => 745637 [1] => 24759 [2] => 6.00 [3] => 2 [4] => 2017-01-01 [5] => 2017-01-02 ) 

会变成:

[20] => Array ( [0] => 745637 [1] => 24759 [2] => 6.00 [3] => 26 [4] => 2016-12-08 [5] => 2017-01-02 ) 

更新:

这是我提出的,它实际上有效,但我想知道是否有更清洁的方法来做到这一点

foreach ($data as $rows) {

 $current = $rows[0].$rows[1].$rows[2];
 $cur_days = $rows[3];
 $cur_begin = $rows[4];
 $cur_end = $rows[5];

 // check if we have a 1-day gap in the date range    
 $comp_date = date_add(date_create($prev_end),   date_interval_create_from_date_string('2 days'));
 $comp_date = date_format($comp_date, 'Y-m-d');

 if (($current == $previous) && ($comp_date == $cur_begin))  {

     $data[$i-1][5] = $cur_end; // update [5] 'end date range'

     // calculate new range in days
     $date_prev_begin = date_create("$prev_begin");
     $date_cur_end = date_create("$cur_end");
     $interval = date_diff($date_prev_begin, $date_cur_end);
     $new_days=$interval->format('%a'); 

     $data[$i-1][3] = $new_days+1; // update [3] 'days' 

     unset($data[$i]); // remove row
 }


// store current row to use for comparison in next iteration

$previous = $current;
$prev_days = $cur_days;    
$prev_begin = $cur_begin;
$prev_end = $cur_end;
$i++;    
}
$data=array_values($data); // rearrange array  

1 个答案:

答案 0 :(得分:1)

不确定它是否更有效但它包含更少的代码行:

$new_data = array();

foreach($data as $row) {

    $cur_begin = new DateTime($row[4]);
    $new_row = $row;
    $days = 0;

    $last_index = !empty($new_data) ? count($new_data)-1 : -1;
    $prev_row = $last_index >= 0 ? $new_data[$last_index] : null;

    if(!empty($prev_row)) {
        $prev_end = new DateTime($prev_row[5]);
        $interval = $prev_end->diff($cur_begin);
        $days = $interval->days;

        $isdiff = $row[0].$row[1].$row[2] != $prev_row[0].$prev_row[1].$prev_row[2];
    }

    if(!empty($prev_row) && $days > 0 && !$isdiff) {
        $new_data[$last_index][3] += $days+1;
        $new_data[$last_index][5] = $row[5];
    } else {
        $new_data[] = $row;
    }

}

var_dump($new_data);

希望它有所帮助。