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 増やし、繰り返しを続行します。2 回目の反復では、RHS の $currentYear 値は 2013 であり、その値をキー 2013 の配列オプションに割り当てます。変数 $currentYear を 1 増やし、反復を続行します。以下の一般的なプログラミングの概念はどうなったのでしょうか?

実際の出力:

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

誰かがより良い説明を思い付くことができれば、それは素晴らしいことです。

4

2 に答える 2

2

上記の理論は間違っています。 PHP 配列では、インクリメント/デクリメントよりも優先順位が高くなります。したがって、PHP は最初に配列キーを実行し (配列キーの最初の要素が 2012 として表示されるのはそのためです)、次に割り当てに進みます。

このシナリオでは、PHP は配列キーを$currentYear値 2012 として保持し、1 ずつインクリメントします。次に、RHS が$currentYear値を取り、それをキー 2012 で配列オプションに割り当てます。同様に、反復を続けます。

于 2012-06-30T16:56:19.927 に答える
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 を返すため、pre-increment を使用する必要があります。例えば:

$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 に答える