foreach之后没有出现新阵列

时间:2014-12-22 14:42:37

标签: php arrays

我有以下代码,您可以看到我想在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
        )

)

3 个答案:

答案 0 :(得分:3)

foreach中的

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