我有一个数据库生成的数组,显示库存产品的连续日期范围。
我遇到的问题是,当缺少日期时,日期范围会被分成两部分,如下面数组的一段所示,其中没有第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
答案 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);
希望它有所帮助。