Почему я не могу отключить элемент массива, переданный по ссылке в foreach l oop? - PullRequest
2 голосов
/ 06 мая 2020

У меня есть массив типа

[0] Bert14:50
[1] hello
[2] Sarah14:50
[3] bye
[4] Dennis14:50
[5] hi
[6] wow

Я хочу уменьшить его, чтобы он выглядел так:

[0] Bert14:50
[1] Sarah14:50
[2] Dennis14:50

Я добился этого с помощью этого кода:

//Doesn't any number exist in the array item? Then remove item
//by first setting it to NULL, and after the loop do some reindexing etc.
foreach($new_str as $item_key => &$item) {
    if (!preg_match('~[0-9]+~', $item)) {
        $item = null;       
    }
}
//Remove null by using unique array...
$new_str = array_values(array_unique($new_str));
//..and then remove first item if it's null
if ($new_str[0] === null) {unset($new_str[0]);}

Но почему этот код не удаляет элементы, не содержащие 0-9? Почему я не могу сбросить значение, переданное по ссылке, как это?

foreach($new_str as $item_key => &$item) {
    if (!preg_match('~[0-9]+~', $item)) {
       //Nothing seems to happen here. Output of $new_str is same as original 
       //array    
       unset($item); 
    }
}

1 Ответ

2 голосов
/ 06 мая 2020

$item в foreach является ссылкой на значение. См. На этой странице объяснение о Снятии ссылок .

Когда вы снимаете ссылку, вы просто разрываете привязку между именем переменной и содержимым переменной. Это не означает, что содержимое переменной будет уничтожено.

Как указано в комментариях, вы можете использовать неустановленную индексацию в массиве с помощью ключа, например unset($new_str[$item_key]); Вам не нужна ссылка &$item.

Более короткий способ сделать это - использовать preg_grep , соответствующий одному di git. Вам не нужен квантификатор + после класса символа, так как вы только определяете, присутствует ли он git.

$new_str = preg_grep("~[0-9]~", $new_str);

Или немного более точно для данных примера, сопоставьте di git, двоеточие и ди git:

$new_str = preg_grep("~[0-9]:[0-9]~", $new_str);

Вывод

Array
(
    [0] => Bert14:50
    [2] => Sarah14:50
    [3] => Dennis14:50
)

Php демо

Если хотите для сброса ключей вы можете использовать array_values($new_str)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...