我有点想弄清楚如何做到这一点。
在我正在循环的数组中,它有多个数组,其中包含以下字段year
和quarter
。年份采用数字形式,如2012
,季度采用文字形式,如Q1
或Q2
现在给我一个例如
的范围从Q1 2013
到:Q3 2014
我可以访问该范围内宿舍的数字形式。
所以这是我上面示例中的变量:$quarter_from
,$quarter_to
,$year_from
和$year_to
我需要弄清楚循环中当前具有字段year
和quarter
的数组是否在给定范围内。
我该如何检查?当然,我可以对years
进行简单的数字检查,但是季度是另一个故事。例如,当前数组可以有Q4
和2013
,并且显然在示例的范围内,并且第一种情况将通过进行一年检查。但对于季度,我该如何检查?
答案 0 :(得分:1)
我认为你可以像这样连接季度和年份,假设从逻辑上选择的范围是有意义的(比从时间上来说更晚)。
来自:20122
=> year 2012 and quarter 2
to:20141
=> year 2014 and quarter 1
因此,即使您的季度值to
小于from
中的季度值,您仍然可以在to
中获得更高的值,因为这一年。
通过这种方式,您现在可以通过连接year
和quarter
字段进行范围检查(执行substr()
以获取字符串的第二个字符并转换为数字然后连接)。
例如,如果显示2013
,Q4
。
看起来像20134
然后像这样进行范围检查
20122 <= 20134 <= 20141
应该有效。
答案 1 :(得分:0)
写这个匆忙,这更像是一个phsudo代码,但应该给你一些想法:
From: Q2 2013
Middle: Q1 2014 (checking if in range of From and To)
To: Q1 2014
现在我们需要比较来自中间和中间和年份的年份,如果年份是相同的,在任何一种情况下你都可以拆分季度以获得季度数量并比较季度以查看是否中间部分实际上在范围内。
fromQuarter = from.quarter.split("")[1] // Q2 => 2
middleQuarter = middle.quarter.split("")[1] // Q1 => 1
toQuarter = to.quarter.split("")[1] // Q1 => 1
If to.year >= middle.year && middle.year >= from.year
// Year range legit.
if(to.year == middle.year || from.year == middle.year)
// We need to check the quarters.
if(to.year == middle.year)
// Need to compare the quarter of the to year and the middle year.
if(toQuarter >= middleQuarter )
// In range.
else
// Out of range.
if(from.year == middle.year)
// Need to compare the quarter of the from year and the middle year.
if(fromQuarter <= middleQuarter)
// In range.
else
// Out of range.
else
// Between two distinct years, in range.
else
// Not in range.
我会很快再次检查这一点,看看我是否犯了逻辑错误。
答案 2 :(得分:0)
试试这个:
function expand($quarter, $year) {
return $year * 4 + $quarter;
}
$quarter_from = 1; $year_from = 2013;
$quarter_to = 3; $year_to = 2014;
$quarter = 3; $year = 2014;
$n1 = expand($quarter_from, $year_from);
$n2 = expand($quarter_to, $year_to);
$n = expand($quarter, $year);
$is_in_range = $n >= $n1 && $n <= $n2;