В. В чем различие цикла forEach от цикла for
О. Цикл forEach создает копию массива в памяти, и служит для быстрого поиска в массиве заданного элемента.
При этом любые изменения самого массива, внутри цикла forEach, ни как на нем не отразятся.
т.е. - Если Вам необходимо, что то найти в массиве, не затрагивая при этом сам массив(не меняя его элементы), то цикл forEach, прекрасно для этого подходит.
Если Вам необходимо менять по ходу цикла значения элементов массива, то используйте цикл for.
В. В чем отличие цикла
for "_i" from 0 to _xxx doот цикла
for "_i" from _xxx to 0 step -1 do
О. Цикл:
for "_i" from 0 to _xxx doПеребирает массив, и Вы можете менять элементы массива, но если Вам необходимо, внутри цикла удалять элементы массива, Вам необходим обратный цикл:
for "_i" from _xxx to 0 step -1 do
Пример некорректного использования цикла:
for "_i" from 0 to _xxx do
Предположим у вас есть массив:
_xxx = [0,2,9,0,2];Как видим, в нем 4 элемента(счет идет с нуля).
Ваша задача, удалить элементы больше 1.
Неправильный цикл:
for "_i" from 0 to count _xxx do // Цикл от нуля и до 4(кол-во элементов массива) { if ( (_xxx select _i) > 1 ) then // Если текущий элемент больше 1 - { _xxx set [_i, -1]; // Заменить текущий элемент массива на -1 _xxx = _xxx - [-1]; // Удалить в массиве элемент [-1] }; };
- При нулевой итерации цикла, будет взято число из массива = 0.
- Число больше 1 - Цикл переходит на следующую итерацию.
- Первая итерация - число будет = 2.
- Число больше 1 -
- Данный элемент будет удален.
- Следующая итерация возьмет число 0!!!
О. После удаления элемента массива, его счетчик так же будет изменен, в следствии этого, т.к. элемента 1 равного 2, более не существует, его заменит элемент 2 равный 9.
И тут сразу 2 ошибки:
- Мы пропустили элемент который должен был быть удален.
- Цикл идет до 4 элементов, а у нас на втором шаге их уже стало 3, т.е. - вы получите ошибку скрипта, при доступе к несуществующему элементу списка.
for "_i" from (count _xxx) to 0 step -1 do // Цикл от 4(кол-во элементов массива) до 0 { if ( (_xxx select _i) > 1 ) then // Если текущий элемент больше 1 - { _xxx set [_i, -1]; // Заменить текущий элемент массива на -1 _xxx = _xxx - [-1]; // Удалить в массиве элемент [-1] }; };