php
  • foreach
  • 2012-12-12 41 views 2 likes 
    2
    <?php 
    $a = array(1, 2, 3, 4, 5); 
    foreach ($a as $key => $elem) { 
        echo "$key = $elem"; echo ' = '; 
        var_dump(current($a));\ 
    } 
    ?> 
    

    運行,當我得到的輸出如下:的foreach和電流

    0 = 1 = int(2) 
    
    1 = 2 = int(2) 
    
    2 = 3 = int(2) 
    
    3 = 4 = int(2) 
    
    4 = 5 = int(2) 
    

    在我看來,這是我應該得到?:

    0 = 1 = int(1) 
    
    1 = 2 = int(2) 
    
    2 = 3 = int(3) 
    
    3 = 4 = int(4) 
    
    4 = 5 = int(5) 
    

    我做的輸出在$ a上的for循環之前的current()並獲得int(1)。因此,它似乎是導致它增加的foreach循環。但是,如果是這種情況,爲什麼只做一次?

    如果我在for循環中調用next(),它會增加,否則增加。當然next()從int(3)開始(即int(2)之後的值)。

    +0

    你爲什麼var_dumping呢? – art2

    +0

    因爲我最初在做next()並且返回bool(false)。我做了var_dump()來區分int(0)和bool(false)。 – neubert

    +0

    爲什麼在這個例子中current = 2?在運行foreach之前,current = 1 –

    回答

    0

    current()使用內部標誌(指針),foreach使用它自己的。

    如果你想(如你在$關鍵的關鍵這是一種愚蠢的),要做到這一點,你可以使用ArrayIterator

    +0

    那麼,爲什麼current()在整個時間內表示int(2)而不是int(1)呢?至於爲什麼我在做current()...我相信它更好地說明了內部標誌行爲比next()或prev()更出乎意料的方式。 – neubert

    1

    從閱讀當前PHP的機制的文檔,它看起來並不像你應該期待的foreach移動當前指針。

    請參閱: http://php.net/manual/en/function.current.php

    什麼是有點混亂的是,每一個功能不移動當前指針。所以,如果你使用each而不是foreach來將你的數組重寫爲一個循環,那麼你會得到所需的當前行爲。

    這裏是你的例子改寫爲每(),它產生預期的結果:

    <?php 
    $a = array(1, 2, 3, 4, 5); 
    while (list($key,$elem) = each($a)) { 
        echo "$key = $elem"; echo ' = '; 
        var_dump(current($a)); 
    } 
    ?> 
    
    +1

    是的 - 這就是令我困惑的事實 - foreach確實似乎在增加指針,但只有一次。在我看來,它應該每次都增加或者根本不增加。 – neubert

    相關問題