【问题标题】:Foreach Iterator Behavioral Difference in PHP 5.2.0 versus PHP 5.3.3PHP 5.2.0 与 PHP 5.3.3 中的 Foreach 迭代器行为差异
【发布时间】:2011-09-26 09:34:03
【问题描述】:
$test = array(1, 2, 3, 4, 5);


foreach($test as $element)
{
    echo $element;        
    $element = next($test);         
    echo $element;
}

这会在 PHP 5.2.0 中产生输出“122334455” 输出“13243545”是在 PHP 5.3.3 中产生的

如何通过控制迭代器最有效地在 5.3.3 中重现 5.2.0 的输出?

这可能是一个错误,因为迭代器在 5.2 中的 foreach 中有效,但在 5.3 的 foreach 中无效。

【问题讨论】:

  • 你想要哪个输出,“122334455”还是“13243545”?
  • 我想要“122334455”。我需要一种方法来控制 foreach 中的迭代器。我曾经使用 next() 和 prev() 进行控制,但它的效果是暂时的,直到 5.3.3 循环中的下一次迭代。
  • 你为什么要首先使用这种行为?你真的不应该改变迭代器 while 你循环它。
  • @RafeKettler 为什么不重要。我只是需要它。我知道我在问什么。这是非常具体的事情。我需要一种方法来控制 foreach 中的迭代器。
  • @FinalForm 如果有一种安全且便携的方式来做你想做的事,那么为什么很重要

标签: php iterator foreach next


【解决方案1】:

这似乎是一个与 PHP 相关的错误。您可以使用更解释性的“for”循环:

$c = count($test);

for($i=0; $i < $c; $i++) {
    echo $test[$i];
    if(isset($test[$i+1])) {
        echo $test[$i+1];
    } else {
        echo $test[$i];
    }
}

【讨论】:

  • 这是“有点”可以接受的。你们中有人有更好的解决方案吗?
  • 已实施。我必须做的。谢谢。不完全是我正在寻找的东西,但我想我必须这样做。我给了你荣誉。
  • 我希望从事 PHP 工作的人修复这个错误。在可迭代对象方面有一个 foreach 取代控制是相当烦人的。
  • 看起来 foreach 和 next 现在在 5.3 中使用相同的数组指针,导致数组指针前进了两次。
【解决方案2】:

我的尝试:

$i = 1;
foreach($test as $element)
{
    echo $element;
    if (isset($test[$i])) {      
        $element = $test[$i];         
        echo $element;
    }

    $i++;
}

这也有效,但内存效率低:

$test  = array(1, 2, 3, 4, 5);
$test2 = $test;

foreach($test as $element)
{
    echo $element;        
    $element = next($test2);         
    echo $element;
}

【讨论】:

    【解决方案3】:

    不知道你在问什么......无论如何:

    echo array_shift($test);
    foreach($test as $v) {
     echo $v.$v;
    }
    

    prints: 122334455 原问题中提出的问题

    【讨论】:

    • 我正在寻求一种方法来控制数组中的迭代器,当它使用 foreach() 进行迭代时。您的解决方案更多的是关于堆栈、弹出和移位,这不是我想要的。它在将数据保存在数组中的同时不控制迭代器。一种在迭代时遍历数组的方法。抱歉,如果这听起来令人困惑。
    • @finalform: 那么你应该彻底改变你的问题
    猜你喜欢
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2011-09-11
    • 2014-08-02
    • 2013-03-23
    • 2011-03-12
    相关资源
    最近更新 更多