0
<?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)
 }

如果有人能提出更好的解释,那就太好了,非常感谢。

4

2 回答 2

2

上述理论是错误的。 在 PHP 中,数组的优先级高于 increment/decrement。因此 PHP 首先执行数组键(这就是数组键的第一个元素出现为 2012 的原因),然后进行赋值。

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

于 2012-06-30T16:56:19.927 回答
1

试着记住递增/递减运算符的概念,你会更好地理解这些运算符。

后增量返回 $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 加一,然后返回 $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
}
于 2012-06-30T17:51:33.340 回答