在函数中调用array_splice / unset:为什么副作用不传播?

时间:2018-06-19 13:26:07

标签: php arrays unset array-splice

我想使用PHP从数组中删除元素,并发现使用array_spliceunset非常简单。

我想在另一个函数中使用此函数,该函数将带有要删除的元素的数组作为参数。但是,该函数具有其他一些返回值,并且该数组应作为副作用进行更新(array_spliceunset都具有副作用)。我的代码如下:

<?php

function removeSomeElements($arr)
{
    for ($i = 0; $i<count($arr); $i++) {
        $c = $arr[$i];
        if ($c > 2) {
            echo "Element $c found at $i\n";
            unset($arr[$i]);
        }
    }
    print_r($arr);  // misses middle element
    return true;
}

$t = [0, 3, 1];

print_r($t);  // original array
$success = removeSomeElements($t);
print_r($t);  // should be missing middle element, but everything is here

我在array_splice上遇到了同样的问题,也就是说,当我用以下内容替换对unset的调用时:

array_splice($arr, $i, 1);
$i--;

该函数的参数在该函数内部很好地更新,但在外部却没有。我想念什么吗?


注意:我可以很容易地找到解决方法,我只是想知道这是否可行,为什么/为什么不能。预先感谢!

2 个答案:

答案 0 :(得分:3)

您需要通过array &传递reference

像这样尝试:

替换此行:

function removeSomeElements($arr)

此行:

function removeSomeElements(&$arr)

Test

答案 1 :(得分:1)

另一种方法是返回函数中更改后的数组,然后像这样设置$t变量:

<?php

function removeSomeElements($arr)
{
    for ($i = 0; $i<count($arr); $i++) {
        $c = $arr[$i];
        if ($c > 2) {
            echo "Element $c found at $i\n";
            unset($arr[$i]);
        }
    }
    print_r($arr);  // misses middle element
    return $arr; // <-- return the altered array
}

$t = [0, 3, 1];

print_r($t);  // original array
$t = removeSomeElements($t); // <-- set the variable
print_r($t);

返回:

Array
(
    [0] => 0
    [1] => 3
    [2] => 1
)
Element 3 found at 1
Array
(
    [0] => 0
    [2] => 1
)
Array
(
    [0] => 0
    [2] => 1
)

https://3v4l.org/Jisfv