【发布时间】: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 将混合所有内容,并且数组必须保持原来的状态(除了添加的键)。此外,这是我知道将键添加到关联数组中的唯一方法。如果你知道的更好,请分享:)