【问题标题】:Moving array internal pointer exceeding maximum execution time移动数组内部指针超过最大执行时间
【发布时间】:2012-09-22 13:06:44
【问题描述】:

我正在尝试构建一个显示 3 个迷你日历月的日历系统。上个月、本月和下个月。

下面的代码应该只是将数组指针移动到当前月份。我以为它在星期五(9 月 28 日)工作,但是今天早上(10 月 1 日)它在日志中导致以下错误: PHP Fatal error: Maximum execution time of 30 seconds exceeded

我怀疑这是新的一个月与它有什么关系,但我正在抓住想法。我希望有人能看到我在这里做错了什么,因为这对我来说都是正确的。

$thisMonth = date('m', time());

$arrMonths = array('01' => '一月', '02' => '二月', '03' => '三月', '04' => '四月',
                    '05' => '五月', '06' => '六月', '07' => '七月', '08' => '八月',
                    '09' => '九月', '10' => '十月', '11' => '十一月', '12' => '十二月');

而(键($arrMonths)!== $thisMonth)
    下一个($arrMonths);

【问题讨论】:

    标签: php arrays calendar


    【解决方案1】:

    这是因为您使用了严格的比较运算符:

    while (key($arrMonths) !== $thisMonth) 
        next($arrMonths);
    

    !== 正在尝试匹配密钥的类型和内容;在这种情况下,因为您已经用单引号声明了它们,所以您的键是字符串。它的类型比较失败(你正在比较一个字符串和一个整数),所以它进入了一个无限循环。

    要修复它,只需使用更宽松的比较运算符:

    while (key($arrMonths) != $thisMonth) 
        next($arrMonths);
    

    感谢@MiDo - 我实际上弄错了:

    the return value of date('m', time()); is a string and the keys are integers when they are >= 10.
    

    【讨论】:

    • 实际上date('m', time()); 的返回值是一个字符串,并且键是>= 10 时的整数。反过来说,但这就是var_dump 告诉我的。不过,放松比较运算符仍然是正确的答案。
    • 嗯。当我不 var_dump 一切时,这就是我得到的。我将编辑更改 - 谢谢!
    • 这可以解释为什么它在星期五起作用,当时密钥是“09”。谢谢@MiDo。谢谢@andrewsi!既然你指出了这一点,那就完全有道理了。
    • 我现在想知道如果我希望键 10 是字符串而不是整数怎么办?但这是一个相当理论化的问题,绝对是另一个问题......
    • @MiDo - 在很大程度上,您选择什么并不重要,特别是如果您使用松散比较运算符。另一方面,如果您使用零填充数字作为索引,则需要将它们存储为字符串(因为如果您将它们保留为整数,PHP 会将它们视为八进制,而 08 和 09 则不会在那种情况下工作)
    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 2018-06-08
    • 2020-04-29
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多