在foreach中动态更改数组

时间:2014-04-15 07:32:11

标签: php arrays foreach

是否有可能以某种方式更改由foreach处理的数组?我试过这个剧本

$iterator = 10;
$cat = array(1 => 'a',2 => 'b',3 => 'c');

foreach ($cat as $k => $c)
{
    if ($iterator < 15)
    {
        $cat[$iterator] = $iterator;
        $iterator++;
    }
    echo $c;  
}

但它没有改变'foreached'数组。 foreach的输出是

  

ABC

但foreach之后的数组中的var_dump是

  

array(6){[1] =&gt; string(1)“a”[2] =&gt; string(1)“b”[3] =&gt; string(1)“c”[10] =&gt; int(10)[11] =&gt; int(11)[12] =&gt; int(12)}

这意味着在foreach cyclus中添加了10,11,12,但是foreach没有迭代它们?有可能吗?或者我是否需要制作2foreach cyclus?

3 个答案:

答案 0 :(得分:3)

<?php
$iterator = 10;
$cat = array(1 => 'a',2 => 'b',3 => 'c');

foreach ($cat as $k => &$c)//observe the '&'
{
    if ($iterator < 15)
    {
        $cat[$iterator] = $iterator;
        $iterator++;
    }
    echo $c;
} 
?>

答案 1 :(得分:3)

互联网需要更多的猫!通过引用传递数组,您将获得所需的结果。请注意循环中的&$cat

$iterator = 10;
$cat = array(1 => 'a',2 => 'b',3 => 'c');

foreach($cat as $k => &$c)
{
    if ($iterator < 15)
    {
        $cat[$iterator] = $iterator;
        $iterator++;
    }
    echo $c;  
}

答案 2 :(得分:3)

实际上,你不应该。因为foreach将与数组副本一起使用。这意味着 - 它将首先复制您的数组,然后循环它。无论你是否要更改原始数组 - 因为你在foreach内使用它的副本,任何修改都只会影响原始数组而不是循环副本。

但是 - 是的,在foreach之后,您会在原始数组中看到您的更改。此外,做这样的事情几乎没有意义。它很难阅读,可能会出现无法预测的结果。

未提及的一件重要事情。以下不会起作用:

$iterator = 10;
$cat = array(1 => 'a');//only one element; same for empty array

foreach ($cat as $k => &$c)
{
    if ($iterator < 15)
    {
        $cat[$iterator] = $iterator;
        $iterator++;
    }
    echo $c;
}

- 因为PHP如何处理foreach中的数组指针。