@BjornBorn

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

<?php

//Создаем массив с числами от 0 до 20
$array = range(0, 20, 1);

//Перебираем его циклом for и удаляем четные элементы массива
for ($i=0; $i <= count($array); $i=$i+2) {
    unset($array[$i]);
}

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


В итоге в браузер выводится:
1
3
5
7
9
11
13
15
16
17
18
19
20

Удалились только первые 8 четных элементов.
  • Вопрос задан
  • 91 просмотр
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Потому что наступает момент, когда $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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы