我有以下代码,您可以看到我想在foreach
内创建一个新数组。即使它在循环中添加完美的内容,一旦循环完成,似乎都会忘记它们。
foreach ($results as $result) {
$result['categories'] = array();
echo '<pre>';print_r($result);echo '</pre>';
}
echo '<pre>';print_r($results);echo '</pre>';
第一个print_r
Array
(
[word_two_id] => 2
[categories] => Array
(
)
)
Array
(
[word_two_id] => 3
[categories] => Array
(
)
)
Array
(
[word_two_id] => 5
[categories] => Array
(
)
)
Array
(
[word_two_id] => 12
[categories] => Array
(
)
)
第二个print_r
Array
(
[0] => Array
(
[word_two_id] => 2
)
[1] => Array
(
[word_two_id] => 3
)
[2] => Array
(
[word_two_id] => 5
)
[3] => Array
(
[word_two_id] => 12
)
)
答案 0 :(得分:3)
$result
将在每次迭代时在循环中被覆盖。例如每次循环滚动时,都会创建一个新的$result
,从而破坏您在上一次迭代中完成的任何修改。
您需要改为引用原始数组:
foreach ($results as $key => $result) {
^^^^^^^
$results[$key]['categories'] = array();
^^^^^^^
请注意修改。你可能会想要使用类似
的东西foreach($results as &$result)
^---
哪个有用,但也会留下$result
指向$results
数组内某处的引用。稍后在代码中重复使用$ result用于其他目的将会使您的阵列变得笨拙,从而导致非常难以跟踪的错误。
答案 1 :(得分:2)
在PHP中,foreach
循环在数组的浅拷贝上运行,这意味着对数组元素的更改不会传播到该循环之外。
要通过引用而不是按值传递数组元素,可以在元素变量的名称前添加&符号(&
),就像这样:
foreach ($results as &$result) {
$result['categories'] = array();
echo '<pre>';print_r($result);echo '</pre>';
}
这样,对数组元素的任何更改都会在引用上对原始数组中的元素执行。
关于使用这种方法的后果,Marc B提出了一个很好的观点in his answer。在foreach
循环完成并且代码继续之后,变量$result
将继续作为对数组中最后一个元素的引用而存在。因此,您不应在不删除其引用的情况下重用$result
变量:
unset($result);
答案 2 :(得分:0)
你也需要钥匙
试试这个
foreach ($results as $key=>$result) {
$result['categories'] = array();
$results[$key] = $result;
}
echo '<pre>';print_r($results);echo '</pre>';