PHP分割数据范围以仅获得块自由
我在整个月的数组中有一个数据范围:PHP分割数据范围以仅获得块自由,php,Php,我在整个月的数组中有一个数据范围: $fullrange = array( "start" => "2019-12-01 00:00:00", "end" => "2019-12-31 23:59:59" ) 现在我在我的活动中进行搜索,得到如下结果: $array_activities = array( 0 => array( "ID" => 45, "Name" => "Activity 1", "start
$fullrange = array(
"start" => "2019-12-01 00:00:00",
"end" => "2019-12-31 23:59:59"
)
现在我在我的活动中进行搜索,得到如下结果:
$array_activities = array(
0 => array(
"ID" => 45,
"Name" => "Activity 1",
"start" => "2019-12-04 10:00:00",
"end" => "2019-12-05 17:00:00"
),
1 => array(
"ID" => 46,
"Name" => "Activity 2",
"start" => "2019-12-07 09:00:00",
"end" => "2019-12-07 17:40:00"
),
2 => array(
"ID" => 65,
"Name" => "Activity 3",
"start" => "2019-12-10 10:00:00",
"end" => "2019-12-15 17:00:00"
),
3 => array(
"ID" => 87,
"Name" => "Activity 3-2",
"start" => "2019-12-11 08:00:00",
"end" => "2019-12-17 21:00:00"
)
);
我的目标是创建一个新的数组:$final
,其中包含原始数据范围(整个月)的所有免费数据块,并且没有任何活动,因此:
$final = array(
0 => array(
"start" => "2019-12-01 00:00:00",
"end" => "2019-12-04 09:59:59"
),
1 => array(
"start" => "2019-12-05 17:00:01",
"end" => "2019-12-07 08:59:59"
),
2 => array(
"start" => "2019-12-07 17:40:01",
"end" => "2019-12-10 09:59:59"
),
3 => array(
"start" => "2019-12-17 21:00:01",
"end" => "2019-12-31 23:59:59"
)
);
但我不太确定如何执行逻辑。$startDateInTimestamp=\DateTime::createFromFormat('Y-m-d H:i:s',$fullrange['start'])->getTimestamp();
$startDateInTimestamp = \DateTime::createFromFormat('Y-m-d H:i:s', $fullrange['start'])->getTimestamp();
$endDateInTimestamp = \DateTime::createFromFormat('Y-m-d H:i:s', $fullrange['end'])->getTimestamp();
function sortBy($a, $b, $value) {
return \DateTime::createFromFormat('Y-m-d H:i:s', $a[$value])->getTimestamp() - \DateTime::createFromFormat('Y-m-d H:i:s', $b[$value])->getTimestamp();
}
function sortByStart($a, $b)
{
return sortBy($a, $b, 'start');
}
function sortByEnd($a, $b)
{
return sortBy($a, $b, 'end');
}
usort($array_activities, 'sortByStart');
$index = 0;
$final = [];
$final[0]['startDate'] = date('Y-m-d H:i:s', $startDateInTimestamp);
while (count($array_activities) > 0) {
$array_activities = array_values($array_activities);
$final[$index]['endDate'] = $array_activities[0]['start'];
unset($array_activities[0]['start']);
usort($array_activities, 'sortByEnd');
$index++;
$final[$index]['startDate'] = $array_activities[0]['end'];
unset($array_activities[0]['end']);
if(!isset($array_activities[0]['end']) && !isset($array_activities[0]['start'])) {
unset($array_activities[0]);
}
usort($array_activities, 'sortByStart');
}
$final[count($final)-1]['endDate'] = date('Y-m-d H:i:s', $endDateInTimestamp);
echo "<pre>";
print_r($final);
echo "</pre>";
$endDateInTimestamp=\DateTime::createFromFormat('Y-m-d H:i:s',$fullrange['end'])->getTimestamp();
函数排序($a,$b,$value){
return\DateTime::createFromFormat('Y-m-d H:i:s',$a[$value])->getTimestamp()-\DateTime::createFromFormat('Y-m-d H:i:s',$b[$value])->getTimestamp();
}
函数排序系统启动($a,$b)
{
返回排序($a,$b,'start');
}
函数排序日期($a,$b)
{
返回排序($a,$b,'end');
}
usort($array_activities,'sortByStart');
$index=0;
$final=[];
$final[0]['startDate']=日期('Y-m-d H:i:s',$startDateInTimestamp);
while(计数($array_活动)>0){
$array\u activities=array\u值($array\u activities);
$final[$index]['endDate']=$array_activities[0]['start'];
未设置($array_activities[0]['start']);
usort($array_activities,'sortByEnd');
$index++;
$final[$index]['startDate']=$array_activities[0]['end'];
未设置($array_activities[0]['end']);
如果(!isset($array_activities[0]['end'])和(&!isset($array_activities[0]['start'])){
未设置($array_activities[0]);
}
usort($array_activities,'sortByStart');
}
$final[count($final)-1]['endDate']=日期('Y-m-d H:i:s',$endDateInTimestamp);
回声“;
打印(最终版);
回声“;
在SQL中这样做可能更容易…@ADyson mhh我需要在纯PHP中这样做,请共享您正在使用的代码。有没有任何尝试来解决这个问题?@NicoHaase我在我的新的post wi示例结果中解释得更好:“我需要用纯php实现它”…因为?这听起来像是一个任意的限制。是什么阻止了您使用SQL?