我有一个带有日期的数组。我必须确定哪个日期属于哪个时期。为此,我有另外两个数组-这些周期的一个带有开始日期,另一个带有结束日期。
我已经尝试过为日期和DatePeriod类进行foreach循环,但无法正常工作。
foreach ($dates as $value) {
foreach ($startdates as $key => $value1) {
foreach ($enddates as $key => $value2) {
if ($value > $value1 && $value < $value2) {
result[$value] = $key;
}
}
}
}
日期(提取)/ $日期
$dates = Array ( [0] => 2011-04-11
[1] => 2011-06-28
[2] => 2011-09-26
[3] => 2012-01-02
[4] => 2012-05-12 )
已分配键的开始日期(提取)/ $ startdates
Array ( [10] => 2011-01-01
[20] => 2011-07-01
[30] => 2012-01-01
[40] => 2012-07-01 )
已分配键的结束日期(提取)/ $ enddates
Array ( [10] => 2011-06-30
[20] => 2011-12-31
[30] => 2012-06-30
[40] => 2012-12-31 )
我希望结果是一个新数组,其中$ dates数组中的日期成为键,开始日期和结束日期数组中的句点变为如下值:
Array ( [2011-04-11] => 10
[2011-06-28] => 10
[2011-09-26] => 20
[2012-01-02] => 30
[2012-05-12] => 30 )
答案 0 :(得分:2)
您可以在主日期变量中循环选择开始日期和结束日期数组的时间段,
// combining keys and values
$temp = array_combine($startdates, $enddates);
$result = [];
// & for making changes on assigned address of variable regardless of array_walk function scope
array_walk($dates, function ($item, $key) use (&$result, $temp, $startdates) {
foreach ($temp as $k => $v) {
// comparing with start and end date range
if (strtotime($item) >= strtotime($k) && strtotime($item) <= strtotime($v)) {
// searching by value and getting key
$result[$item] = array_search($k, $startdates);
// if comes to this loop break as its never gonna come here
break;
}
}
});
array_combine —通过使用一个数组作为键并使用另一个数组作为其值来创建数组
array_walk —将用户提供的函数应用于数组的每个成员
array_search —在数组中搜索给定值,如果成功,则返回第一个对应的键
输出
Array
(
[2011-04-11] => 10
[2011-06-28] => 10
[2011-09-26] => 20
[2012-01-02] => 30
[2012-05-12] => 30
)
Demo。
答案 1 :(得分:1)
因为您要比较Y-m-d格式的日期,所以不需要日期/时间函数-换句话说,只需将日期视为字符串即可。
同时迭代开始和结束元素。找到正确的范围后,请存储数据并继续进行下一个评估日期。
代码:(Demo)
$dates = ['2011-04-11', '2011-06-28', '2011-09-26', '2012-01-02', '2012-05-12'];
$startdates = [
10 => '2011-01-01',
20 => '2011-07-01',
30 => '2012-01-01',
40 => '2012-07-01'
];
$enddates = [
10 => '2011-06-30',
20 => '2011-12-31',
30 => '2012-06-30',
40 => '2012-12-31'
];
foreach ($dates as $date) {
foreach ($startdates as $key => $startdate) {
if ($date >= $startdate && $date <= $enddates[$key]) {
$result[$date] = $key;
continue 2;
}
}
$result[$date] = 'out of bounds';
}
var_export($result);
输出:
array (
'2011-04-11' => 10,
'2011-06-28' => 10,
'2011-09-26' => 20,
'2012-01-02' => 30,
'2012-05-12' => 30,
)