【问题标题】:foreach doesn't print altered array properlyforeach 无法正确打印更改后的数组
【发布时间】:2014-07-28 17:24:02
【问题描述】:

我正在尝试使用 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 />";
    
    ?>
    

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

编辑:

用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.

【问题讨论】:

  • 我认为insert_before_key 函数不适用于关联数组...
  • 查看您的代码,如果您需要“插入”,因为您希望数组元素按其键排序,为什么不直接附加新元素和 ksort()阵列? 'no_color' 将放在最后,但 color1.5 将放在 color1 和 color2 之间(我认为:-p)
  • @rlatief:这只是一个简单的例子来说明我的意思,但真正的代码有不同的键。 ksort 将混合所有内容,并且数组必须保持原来的状态(除了添加的键)。此外,这是我知道将键添加到关联数组中的唯一方法。如果你知道的更好,请分享:)

标签: php arrays foreach


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    所以在迭代过程中你试图改变被迭代项的值

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

    在迭代中使用 $array 的副本

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

    【讨论】:

    • 但是如果添加了新密钥,我也需要显示。
    【解决方案3】:

    我会保持简单。但是,有些事情告诉我,您在这里解决的是问题的影响,而不是问题的根源。

    $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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多