我有一个数组,它有开始日期,结束日期和价格,例如.

/* date formate 'yyyy-mm-dd' */

$existingRanges = [
  ['start_date' => '2023-11-22', 'end_date' => '2023-11-30', 'price' => 200],
  ['start_date' => '2023-12-10', 'end_date' => '2023-12-14', 'price' => 100],
  ['start_date' => '2023-12-15', 'end_date' => '2023-12-20', 'price' => 100],
  ['start_date' => '2023-12-21', 'end_date' => '2023-12-27', 'price' => 100],
  ['start_date' => '2024-01-05', 'end_date' => '2024-01-05', 'price' => 600],
  ['start_date' => '2024-01-06', 'end_date' => '2024-01-07', 'price' => 700],
  ['start_date' => '2024-01-08', 'end_date' => '2024-01-20', 'price' => 700],
  ['start_date' => '2024-01-21', 'end_date' => '2024-01-31', 'price' => 100],
];

我想在这里合并所有的日期是相邻的,但有相同的价格,即100101102103这两个日期范围是相邻的,他们的价格是一样的,所以它应该是100103和价格700.

我的结果数组示例.

$results = [
  ['start_date' => '2023-11-22', 'end_date' => '2023-11-30', 'price' => 200],
  ['start_date' => '2023-12-10', 'end_date' => '2023-12-27', 'price' => 100],
  ['start_date' => '2024-01-05', 'end_date' => '2024-01-05', 'price' => 600],
  ['start_date' => '2024-01-06', 'end_date' => '2024-01-20', 'price' => 700],
  ['start_date' => '2024-01-21', 'end_date' => '2024-01-31', 'price' => 100],
];

我try 的代码/逻辑

function mergeDateRanges($p_arrDateranges) {
  // sort by start date
  /* usort($p_arrDateranges, function($a1, $a2) {
    return $a1['start_date'] === $a2['start_date'] ? 0 : ($a1['start_date'] < $a2['start_date'] ? -1 : 1);
   }); */

   $finalArray = [];
   $arrMerged = array();
   $arrLastDR = null;
   foreach ($p_arrDateranges as $arrDR) {

     if ($arrLastDR === null) {
       $arrLastDR = $arrDR;
       continue;
     }

     if(!$arrMerged) {
      array_push($arrMerged, $arrLastDR);
     }

     $endDate = DateTime::createFromFormat('Y-m-d', $arrLastDR['end_date']);
     $sLastDateE_1 = $endDate->modify('+1 day')->format('Y-m-d');

     if (strtotime($arrDR['start_date']) < strtotime($sLastDateE_1) && $arrDR['price'] == $arrLastDR['price']) {
       array_push($finalArray, [
         'start_date' => $arrDR['start_date'], 
         'end_date' => $arrLastDR['end_date'], 
         'price' => 0
       ]);
     } else {
       array_push($finalArray, $arrDR);
     }

     $arrLastDR = $arrDR;
     array_push($arrMerged, $arrLastDR);
     //print_r($arrLastDR);
 }

 return $finalArray;
}

mergeDateRanges($existingRanges);

这是返回不同的结果,所以请帮助我解决这个问题.

推荐答案

如果上一个结束日期的时间比较等于当前开始日期,以及价格判断,则只将结束日期$arrLastDR更新为当前的结束日期(我们可以称之为合并).

如果它们不匹配,则此合并段仅在此索引之前有效.所以,把它加到$finalArray上,用当前的开始一个新的$arrLastDR.


因此,请更改以下内容

if(!$arrMerged) {
      array_push($arrMerged, $arrLastDR);
     }

     $endDate = DateTime::createFromFormat('Y-m-d', $arrLastDR['end_date']);
     $sLastDateE_1 = $endDate->modify('+1 day')->format('Y-m-d');

     if (strtotime($arrDR['start_date']) < strtotime($sLastDateE_1) && $arrDR['price'] == $arrLastDR['price']) {
       array_push($finalArray, [
         'start_date' => $arrDR['start_date'], 
         'end_date' => $arrLastDR['end_date'], 
         'price' => 0
       ]);
     } else {
       array_push($finalArray, $arrDR);
     }

     $arrLastDR = $arrDR;
     array_push($arrMerged, $arrLastDR);

to

 $endDate = DateTime::createFromFormat('Y-m-d', $arrLastDR['end_date']);
     $sLastDateE_1 = $endDate->modify('+1 day')->format('Y-m-d');

     if (strtotime($arrDR['start_date']) == strtotime($sLastDateE_1) && $arrDR['price'] == $arrLastDR['price']) {
        $arrLastDR['end_date'] = $arrDR['end_date'];
     }else{
        array_push($finalArray, $arrLastDR);
        $arrLastDR = $arrDR;
     }
     
    }
    
    if($arrLastDR !== null){
        array_push($finalArray, $arrLastDR);
    }

Live Demo

Note:不需要任何显式排序,因为您已经确认输入是以排序方式进行的.

Php相关问答推荐

如果WooCommerce中存在特定的运输方式,则隐藏其他运输方式

具有重叠捕获组的PHP正则表达式

Symfony装置加载:try 从命名空间加载类";ClassUtils";Doctrine\Common\Util";

在WooCommerce产品变体SKU字段旁边添加自定义输入字段

将SVG包含在另一个php生成的SVG中

如何使用索引加速和优化MySQL搜索

使用CODIGNITER3中的OR和AND子句进行查询

Laravel路由到控制器传输变量解决方案需要

文本到语音:不考虑音高值

允许在WooCommerce管理订单列表中使用计费邮箱进行搜索

图片上传成功

如何在 php 中获取正确的时间

PHP文件如何从CSS执行

ACF 更新字段功能不更新 WordPress 中的任何数据

php preg_match 验证 Tiktok 用户名

如何在 WooCommerce 中显示每个自定义选项卡的内容

在 GA4 Data API V1 Beta 中使用 inListFilter 过滤器时出错

为什么可以从 PHP 类访问 PHP Trait 的私有成员?

使用 --exclude-dir 选项从 PHP 执行 grep 时出现问题

如何在没有函数的情况下在php中获取数组的所有组合