---
name: "forEach"
type: command
status: ok
groups: ["Program Flow", "Arrays", "HashMap"]
arma3_since: "0.50"
locality: {"argument": null, "effect": null, "server_exec": false}
source: https://community.bistudio.com/wiki/forEach
revid: 378167
updated: 2026-03-02T16:49:17Z
---

# forEach

*Command · Program Flow, Arrays, HashMap · Arma 3 v0.50 · introduced in Operation Flashpoint v1.00*

## Description

Executes the given command(s) on every item of an [Array](../topics/Array.md) or a [HashMap](../topics/HashMap.md).

> [!NOTE]
> **Arma 2:** Since Arma 2, the variable [_x](../topics/Magic_Variables.md#x) is always [private](../commands/private.md) to the [forEach](../commands/forEach.md) block so it is safe to nest them (see [#Example 8](../commands/forEach.md#example-8)).

## Syntax

### Syntax 1

```sqf
code forEach array
```

**Parameters:**

- `|  |  |  |  |  |  |  |  |`
  |---|---|---|---|---|---|---|---|
  | Game | Operation Flashpoint v1.00 | Operation Flashpoint v1.85 | Armed Assault v1.00 | Arma 2 v1.00 | Arma 2: Operation Arrowhead v1.50 | Arma 3 v1.00 | Take On Helicopters v1.00 |
  | [String](../topics/String.md) support | ✓ | ✗ |  |  |  |  |  |
  | [Code](../topics/Code.md) support | ✗ | ✓ |  |  |  |  |  |

  code: [String](../topics/String.md) only in Operation Flashpoint until v1.85 or Arma: Cold War Assault v1.85 [Code](../topics/Code.md) - available variables:
  - `_x`: iterated item
  - Arma 2: Operation Arrowhead v1.55 `_forEachIndex`: item's index
- `array`: [Array](../topics/Array.md) - the array to iterate over

**Returns:** [Anything](../topics/Anything.md) - will return the value of last executed statement

### Syntax 2

*since arma3 2.02*

```sqf
code forEach hashMap
```

**Parameters:**

- `code`: [Code](../topics/Code.md) - code applied to each key-value pair - available variables:
  - `_x`: key
  - `_y`: value
  - `_forEachIndex`: iteration number
- `hashMap` : [HashMap](../topics/HashMap.md) - the HashMap to iterate over

**Returns:** [Anything](../topics/Anything.md) - will return the value of last executed statement

## Examples

### Example 1

```sqf
// SQF
{ _x setDamage 1 } forEach units player;
```

```sqs
; SQS
"_x setDammage 1" forEach units player
```

### Example 2

This command can also easily be used to execute a single command multiple times without respect to the array items - see also [for](../commands/for.md)

```sqf
{ player addMagazine "30Rnd_556x45_Stanag" } forEach [1, 2, 3, 4];
// equivalent to
for "_i" from 1 to 4 do { player addMagazine "30Rnd_556x45_Stanag" };
```

### Example 3

You can also use multiple commands in the same block:

```sqf
{
    _x setCaptive true;
    removeAllWeapons _x;
    doStop _x;
} forEach units group this;
```

### Example 4

To get the index of a [forEach](../commands/forEach.md) loop, use [_forEachIndex](../topics/Magic_Variables.md#foreachindex):

```sqf
{ systemChat str _forEachIndex; } forEach ["a", "b", "c"]; // will return: "0", "1", "2" in systemChat messages
```

### Example 5

Iterating a [HashMap](../topics/HashMap.md)'s [_forEachIndex](../topics/Magic_Variables.md#foreachindex):

```sqf
// shows "0, k1, v1", "1, k2, v2" in systemChat messages
{
    systemChat format ["%1, %2, %3", _forEachIndex, _x, _y];
} forEach createHashMapFromArray [
    ["k1", "v1"],
    ["k2", "v2"]
];
```

### Example 6

[findIf](../commands/findIf.md) equivalent for [HashMap](../topics/HashMap.md):

```sqf
private _resultKey = {
    if (_y isEqualTo "wantedValue") exitWith { _x };
    ""
} forEach _hashmap;
```

### Example 7

Array is edited by reference:

```sqf
_arr1 = [1,2,3];
_arr2 = [6,7,8];
_arr3 = [0];
{ _x set [1, "changed"] } forEach [_arr1, _arr2, _arr3];
// _arr1 = [1, "changed", 3]
// _arr2 = [6, "changed", 8]
// _arr3 = [0, "changed"]
```

### Example 8

```sqf
{
    private _verticalValue = _x; // needed, otherwise _horizontalValues' _x made this one inaccessible
    {
        [_x, _verticalValue] call TAG_fnc_doSomething;
    } forEach _horizontalValues;
} forEach _verticalValues;
```

## See also

[Control Structures](../topics/Control_Structures.md) · [for](../commands/for.md) · [apply](../commands/apply.md) · [while](../commands/while.md) · [select](../commands/select.md) · [findIf](../commands/findIf.md) · [count](../commands/count.md) · [forEachReversed](../commands/forEachReversed.md)

## Community notes

**Dedmen** — 2017-11-28

Be careful when deleting ([deleteAt](../commands/deleteAt.md)) elements from an Array while you iterate over it.

[_forEachIndex](../topics/Magic_Variables.md) will not move to reflect your change.

The forEach code is doing the same as

```sqf
private _forEachIndex = 0;
while { _forEachIndex < count _array } do
{
    (_array select _forEachIndex) call code;
    _forEachIndex = _forEachIndex + 1;
};
```

So if you delete your current element from the array the other elements will shift forward. Meaning you skip one element.

Example:

```sqf
_array = [1,2,3,4,5,6];
{ _array deleteAt _forEachIndex } forEach _array;
```

After the first iteration your Array will be [2,3,4,5,6] and the _forEachIndex will be 1.

So on next iteration you get the element at index 1 which will be 3. So you've just skipped the 2.

So in the end you will only iterate over 1, 3 and 6.

---

**Sa-Matra** — 2023-04-02

Use new [forEachReversed](../commands/forEachReversed.md) command for deleting array items with [deleteAt](../commands/deleteAt.md). Check its examples for details.

<sub>Source: [BI Community Wiki — forEach](https://community.bistudio.com/wiki/forEach) (revision 378167).</sub>
