<?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) }
如果有人能够提出更好的解释,那将是非常好的,并且非常感激。
答案 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
}