foreach不能正确打印更改的数组

时间:2014-07-28 17:24:02

标签: php arrays foreach

我正在尝试使用 foreach 打印数组,并且在打印时,如果出现某个$ key,我想对数组进行更改。问题是,即使数组发生变化,也不会打印更改。

在下面的示例中,您将找到:

  • 我用来改变数组的功能;
  • 首先打印的数组没有更改;
  • 然后回显打印输出过程中的更改 - 全部使用foreach;
  • 同一张桌子的另一张打印件,但这次有了更改。

    <?php
    
    function insert_before_key($array, $key, $data = NULL){
        if (($offset = array_search($key, array_keys($array))) === false){
            $offset = count($array); 
        }
        return array_merge(array_slice($array, 0, $offset), (array) $data, array_slice($array, $offset));
    }
    
    $array = array(
        "no_color"  =>  "blank",
        "color1"    =>  "red",
        "color2"    =>  "green",
        "color3"    =>  "blue",
        );
    
    echo "<pre>";
    print_r($array);
    echo "</pre>";
    
    foreach ($array as $key => $value) {
        echo $key . ": " . $value . "<br />";
        if ($key === "color1"){
            $array = insert_before_key($array, "color2", array("color1.5" => "yellow"));
        }
    }
    
    echo "<pre>";
    print_r($array);
    echo "</pre>";
    
    echo "<br />";
    
    ?>
    

请注意,新的$键是跳入 AFTER 当前$键,所以我希望它会出现。 知道为什么会这样吗?

编辑:

使用foreach玩了一下,我认为它必须缓存密钥或其他东西......

    <?php
    $test_array = array(0,1,2,3,4,5,6,7,8,9);

    foreach ($test_array as $key => $value) {
        if ($key === 5){$test_array[7] = $test_array[7]+1;}
        echo $key . ": " . $value . "<br />";
    }

    print_r($test_array);
    ?>

以上将显示UNCHANGED echo,但是CHANGED print_r。

3 个答案:

答案 0 :(得分:3)

从手册:“由于foreach依赖于内部数组指针,在循环中更改它可能会导致意外行为。” http://php.net/manual/en/control-structures.foreach.php

你不应该修改你正在循环的数组。

答案 1 :(得分:2)

因此,在迭代期间,您尝试更改正在迭代的项的值

foreach($array ...)
{
    change $array
}

在迭代中使用$ array的副本

 $array2 = $array
 foreach($array ...)
{
    change $array2
}

答案 2 :(得分:0)

我会保持简单。然而有些东西告诉我你在这里修复问题的影响而不是它的来源。     

$array = array(
    "no_color"  =>  "blank",
    "color1"    =>  "red",
    "color2"    =>  "green",
    "color3"    =>  "blue",
);

$temp_array = array();

foreach ($array as $key => $value) {
    $temp_array[$key] = $value;
    echo $key . ": " . $value . "<br />";
    if ($key == 'color1') {
        $key_add = 'color1.5';
        $value_add = 'yellow';
        $temp_array[$key_add] = $value_add;
        echo $key_add . ": " . $value_add . "<br />";
    }
}

$array = $temp_array;