使用php end的数组赋值不能按预期工作

时间:2018-05-01 14:32:54

标签: php

如果我有一个数组:

[
   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

希望很清楚:)

3 个答案:

答案 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']);