BUG:数组键的PHP预增量和后增量变量

时间:2012-06-30 16:56:19

标签: php bug-tracking

<?php
$options = array();
$currentYear = 2012;

while($currentYear < (2012 + 3) ) {
    $options[$currentYear++] = $currentYear;
}

var_dump($options);
?>

预期产出:

array(3) {
     [2012]=> int(2012)
     [2013]=> int(2013)
     [2014]=> int(2014)
}

通用理论:首先执行任务的RHS并将RHS值分配给LHS。在执行RHS后,它将在LHS中执行后增量。根据这种情况,我们可以解释迭代如下。

在第一次迭代中,RHS $ currentYear值为2012,并将该值分配给具有键2012的数组选项。将变量$ currentYear递增1,然后继续迭代。在第二次迭代中,RHS $ currentYear值为2013,并将该值分配给具有键2013的数组选项。将变量$ currentYear递增1,然后继续迭代。 下面这个通用编程概念发生了什么?

实际输出:

 array(3) {
     [2012]=> int(2013)
     [2013]=> int(2014)
     [2014]=> int(2015)
 }

如果有人能够提出更好的解释,那将是非常好的,并且非常感激。

2 个答案:

答案 0 :(得分:2)

以上理论是错误的。 In PHP arrays have higher precedence than increment/decrement。因此,PHP首先执行数组键(这就是数组键的第一个元素出现为2012的原因)然后转到赋值。

在这种情况下,PHP将数组键保持为$currentYear值2012并递增1.然后它来到RHS获取$currentYear值并使用键2012将其分配给数组选项。同样,它继续迭代。

答案 1 :(得分:1)

尽量记住Incrementing/Decrementing Operators的概念,你会更好地理解这些操作符。

后增量返回$ currentYear,然后将$ currentYear增加1,基于此,您的情况发生的情况如下:

$currentYear = 2012;

$options[$currentYear++] = $currentYear;

/* Post-increment will return 2012 to the array, after this will increment it to 
 * 2013, so in the right side it will be 2013, then you'll get the result below. 
 * Remember that PHP analyses the code from left to right.
 */

$options[2012] == 2013;

要获得预期结果,必须使用预增量,因为它会将$ currentYear增加1,然后返回$ currentYear。例如:

$currentYear = 2012;

$options[++$currentYear] = $currentYear;

/* Pre-increment will increment $currentYear first, after this will return the 
 * value to array, so $currentYear will have the same value in both sides. 
 * Like below.
 */

$options[2013] == 2013;

编辑1

由于你的第一个索引和$currentYear必须相等,你必须使用不同的逻辑,如下所示:

$options = array();
$currentYear = 2012;

while($currentYear < (2012 + 3) ) {
    $options[$currentYear] = $currentYear;

    $currentYear++; // "++$currentYear" and "$currentYear += 1" will work too
}