Почему в 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(), и ваш первый цикл заканчивается, не обработав весь массив. <br/> <br/> i = 0, c = 21 <br/> i = 2, c = 20 <br/> i = 4, c = 19 <br/> i = 6, c = 18 <br/> i = 8, c = 17 <br/> i = 10, c = 16 <br/> i = 12, c = 15 <br/> i = 14, c = 14 <br/> Это последний заход в тело цикла, в массиве остаётся 13 элементов. <br/> <br/> Чтобы этого не происходило, нужно до запуска цикла записать размер массива в отдельную переменную и использовать в цикле её.
Как вам уже ответили, потому-что вы увеличиваете значение $i ( <b>$i=$i+2</b> ) и в то же время уменьшаете количество элементов в массиве ( <b>unset($array[$i])</b> ). <br/> <br/> Чтобы удалить все четные значения из массива, вы можете переписать свой код следующим образом: <br/> <pre><code class="php">//Создаем массив с числами от 0 до 20
$array = range(0, 20, 1);

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

foreach ($array as $value){
	echo $value . '&lt;br&gt;';
}</code></pre> <br/> Результат выполнения будет таким: 1 3 5 7 9 11 13 15 17 19
Похожие вопросы