Вызов array_splice / unset в функции: почему побочный эффект не распространяется?

Я хочу удалить элементы из массива с помощью PHP и увидел, что это довольно легко с array_splice или же unset,

Я хотел бы использовать это внутри другой функции, которая принимает этот массив с элементами для удаления в качестве параметров. Однако у функции есть другое возвращаемое значение, и массив должен быть обновлен как побочный эффект (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--;

Параметр функции хорошо обновляется внутри функции, но не снаружи. Я что-то пропустил?


Замечания: Я могу найти обходной путь для этого довольно легко, я просто хотел знать, возможно ли это и почему / почему нет. Заранее спасибо!

1

Решение

Вам нужно пройти массив от ссылка &,

Попробуйте это так:

Заменить эту строку:

function removeSomeElements($arr)

С этой строкой:

function removeSomeElements(&$arr)

Тестовое задание

3

Другие решения

Альтернативный метод — вернуть измененный массив в функцию, а затем установить $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

1

По вопросам рекламы [email protected]