在函数中调用 array_splice/unset:为什么副作用不传播?
Calling array_splice/unset in a function: why does side effect not propagate?
我想使用 PHP 从数组中删除元素,发现使用 array_splice
或 unset
非常容易。
我想在另一个函数中使用它,该函数将此数组和要删除的元素作为参数。然而,函数有一些其他的 return 值,数组应该作为副作用更新(array_splice
或 unset
都通过副作用起作用)。我的代码如下所示:
<?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--;
函数的参数在函数内部更新的很好,但在外部没有。我错过了什么吗?
注意:我可以很容易地找到解决方法,我只是想知道这是否可行以及为什么/为什么不可行。提前致谢!
这样试试:
替换此行:
function removeSomeElements($arr)
这一行:
function removeSomeElements(&$arr)
另一种方法是 return 函数中改变的数组,然后像这样设置 $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);
Returns:
Array
(
[0] => 0
[1] => 3
[2] => 1
)
Element 3 found at 1
Array
(
[0] => 0
[2] => 1
)
Array
(
[0] => 0
[2] => 1
)
我想使用 PHP 从数组中删除元素,发现使用 array_splice
或 unset
非常容易。
我想在另一个函数中使用它,该函数将此数组和要删除的元素作为参数。然而,函数有一些其他的 return 值,数组应该作为副作用更新(array_splice
或 unset
都通过副作用起作用)。我的代码如下所示:
<?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--;
函数的参数在函数内部更新的很好,但在外部没有。我错过了什么吗?
注意:我可以很容易地找到解决方法,我只是想知道这是否可行以及为什么/为什么不可行。提前致谢!
这样试试:
替换此行:
function removeSomeElements($arr)
这一行:
function removeSomeElements(&$arr)
另一种方法是 return 函数中改变的数组,然后像这样设置 $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);
Returns:
Array
(
[0] => 0
[1] => 3
[2] => 1
)
Element 3 found at 1
Array
(
[0] => 0
[2] => 1
)
Array
(
[0] => 0
[2] => 1
)