如果我有一个数组:
[
start => 2018-01-01 12:00
end => 2018-01-01 15:00
],
[
start => 2018-01-01 12:00
end => 2018-01-01 17:00
],
这个数组可以有任意数量的开始和结束日期,我需要按开始和结束时间过滤每一天。即,2018-01-01可以有5个具有不同开始和结束时间的条目。
我需要以一个具有较早开始时间和最后结束时间的单个数组结束:
[
start => 2018-01-01 12:00
end => 2018-01-01 17:00
]
在我的循环中,我正在比较结束时间,如果第二个大于第一个,我想将end
的值替换为这个新值:
$newArr[] = $dates[0];
foreach($dates as $date) {
if ($date['end'] > end($newArr)['end'] {
end($newArr)['end'] = $date['end']
}
}
出于某种原因,此作业实际上并不起作用 - 它仍然是初始设置end => 15:00
希望很清楚:)
答案 0 :(得分:2)
问题是,end()
返回一个值,而不是一个引用
通过手动指向最后一个索引,它将按预期工作:
$newArr[] = $dates[0];
foreach($dates as $date) {
if ($date['end'] > $newArr[max(array_keys($newArr))]['end']) {
$newArr[max(array_keys($newArr))]['end'] = $date['end'];
}
}
echo "<pre>";
var_dump($newArr);
echo "</pre>";
工作代码段:https://3v4l.org/RCqA0
答案 1 :(得分:0)
没有理由在任何一个地方使用end()
,因为您只想在结果中使用一个元素:
$newArr[] = $dates[0];
foreach($dates as $date) {
if ($date['end'] > $newArr[0]['end']) {
$newArr[0]['end'] = $date['end'];
}
if ($date['start'] < $newArr[0]['start']) {
$newArr[0]['start'] = $date['start'];
}
}
此外,您当前的代码仅检查并添加end
而非start
。
答案 2 :(得分:-1)
您可能希望在进行比较之前尝试将datetime转换为时间戳。
$ timestamp ['end'] = strtotime($ date ['end']);