Почему в PHP функция unset удаляет только нечетные элементы массива в цикле for?

Как можно изменить данный код на PHP, чтобы удалить все четные элементы из массива чисел от 0 до 20 и корректно вывести оставшиеся элементы на экран?
  • 14 июня 2024 г. 15:11
Ответы на вопрос 3
Функция `unset()` удаляет элементы массива по их индексам. При использовании цикла `for` для удаления четных элементов из массива чисел от 0 до 20, необходимо учитывать, что при каждом удалении элементы массива смещаются, и индексы изменяются.

Для удаления четных элементов из массива и корректного вывода оставшихся элементов на экран можно воспользоваться следующим кодом:

```php
<?php
$numbers = range(0, 20); // создаем массив чисел от 0 до 20

for ($i = count($numbers) - 1; $i >= 0; $i--) {
    if ($numbers[$i] % 2 == 0) {
        unset($numbers[$i]); // удаляем четные элементы
    }
}

foreach ($numbers as $number) {
    echo $number . " "; // выводим оставшиеся элементы
}
?>
```

Этот код сначала создает массив чисел от 0 до 20, затем проходит по каждому элементу массива с конца к началу при помощи цикла `for`, проверяет его на четность и при необходимости удаляет его при помощи функции `unset()`. После завершения удаления, с помощью цикла `foreach` выводятся оставшиеся элементы на экран.
Потому что наступает момент, когда $i становится больше, чем count(), и ваш первый цикл заканчивается, не обработав весь массив. 

i = 0, c = 21
i = 2, c = 20
i = 4, c = 19
i = 6, c = 18
i = 8, c = 17
i = 10, c = 16
i = 12, c = 15
i = 14, c = 14
Это последний заход в тело цикла, в массиве остаётся 13 элементов.

Чтобы этого не происходило, нужно до запуска цикла записать размер массива в отдельную переменную и использовать в цикле её.
Как вам уже ответили, потому-что вы увеличиваете значение $i ( $i=$i+2 ) и в то же время уменьшаете количество элементов в массиве ( unset($array[$i]) ). 

Чтобы удалить все четные значения из массива, вы можете переписать свой код следующим образом:
//Создаем массив с числами от 0 до 20
$array = range(0, 20, 1);

foreach($array as $i => $v) {
        // проверяем остаток при делении по модулю
	if ($v % 2 === 0) {
		unset($array[$i]);
	}
}

foreach ($array as $value){
	echo $value . '<br>';
}

Результат выполнения будет таким: 1 3 5 7 9 11 13 15 17 19
Похожие вопросы