【问题标题】:Range check of a quarter and year?季度和年度的范围检查?
【发布时间】:2014-06-26 15:03:21
【问题描述】:

我有点卡在弄清楚如何做到这一点。

在我循环的数组中,它有多个数组,其中包含以下字段yearquarter。年份为数字形式,如2012,季度为文本形式,如Q1Q2

现在给我一个范围,例如

从:Q1 2013 到:Q3 2014

我可以访问范围内四分之一的数字形式。

这就是我从上面示例中得到的变量:$quarter_from$quarter_to$year_from$year_to

我需要确定循环中包含字段yearquarter 的当前数组是否在给定范围内。

我该如何进行检查?当然,我可以对years 进行简单的数字检查,但宿舍是另一回事。例如,当前数组可能有Q42013,这显然在示例的范围内,第一种情况将通过进行年份检查。但是对于季度,我该如何检查呢?

【问题讨论】:

标签: php arrays


【解决方案1】:

我认为你可以像这样连接季度和年份,假设逻辑上选择的范围是有意义的(就时间而言,to 比 from 晚)。

来自:20122 => year 2012 and quarter 2

收件人:20141 => year 2014 and quarter 1

因此,即使您的季度值在to 中小于该季度在from 中的值,您仍然会因为年份而在to 中获得更高的值。

通过这种方式,您现在可以通过连接yearquarter 字段来进行这样的范围检查(执行substr() 以获取字符串的第二个字符并转换为数字然后连接)。

例如,如果出现2013Q4

看起来像 20134 然后像这样进行范围检查

20122 <= 20134 <= 20141 应该可以工作。

【讨论】:

  • 因为这是最快的,只需要几行代码就可以实现。我会选择这个。
【解决方案2】:

匆忙写了这个,它更像是一个phsudo代码,但应该给你一些想法:

From: Q2 2013
Middle: Q1 2014 (checking if in range of From and To)
To: Q1 2014

现在我们需要比较 from 和 middle 和 middle 和 to 的年份,如果两种情况下年份相同,则可以拆分季度以获取季度数,然后比较季度以查看中间是否部分实际上在范围内。

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.

我会很快再检查一次,看看我是否犯了逻辑错误。

【讨论】:

    【解决方案3】:

    试试这个:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      相关资源
      最近更新 更多