php
  • foreach
  • 2012-12-12 105 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

    相关问题