我正在尝试使用 foreach 打印数组,并且在打印时,如果出现某个$ key,我想对数组进行更改。问题是,即使数组发生变化,也不会打印更改。
在下面的示例中,您将找到:
同一张桌子的另一张打印件,但这次有了更改。
<?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。
答案 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;