forEach

From Bohemia Interactive Community
Revision as of 15:48, 12 June 2021 by Lou Montana (talk | contribs) (Text replacement - " <dl class="command_description"> <dt><dt>" to " <dl class="command_description"> <dt><dt>")
Jump to navigation Jump to search
Hover & click on the images for description

Description

Description:
Executes the given command(s) on every item of an array. In Arma 2 and later, the variable _x is always private to the forEach block so it is safe to nest them.
Groups:
Program FlowArraysHashMap

Syntax

Syntax:
code forEach array
Parameters:
code: String in Operation Flashpoint and Armed Assault, Code since Armed Assault - The array item that is currently being iterated over is represented by _x. The index of the current element is accessible via _forEachIndex
array: Array - The array to iterate over
Return Value:
Anything - Will return the value of last executed statement

Alternative Syntax

Syntax:
code forEach hashMap Template:Since
Parameters:
code: Code - Code applied to each key-value pair. The Magic Variable _x contains the key, _y the value
hashMap : HashMap - The HashMap to iterate over
Return Value:
Anything - Will return the value of last executed statement

Examples

Example 1:
// SQF { _x setDamage 1 } forEach units player; ; 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. { player addMagazine "30Rnd_556x45_Stanag"; } forEach [1, 2, 3, 4];
Example 3:
You can also use multiple commands in the same block: { _x setCaptive true; removeAllWeapons _x; doStop _x; } forEach units group this;
Example 4:
To get the index of a forEach loop, use _forEachIndex: { systemChat str _forEachIndex]; } forEach [1,2,3]; // will return: "0", "1", "2" in systemChat messages
Example 5:
Iterating a HashMap _forEachIndex: { systemChat format ["%1-%2", _x, _y]; } forEach createHashMapFromArray [[1,"a"], [2,"b"]]; // will return: "1-a", "2-b" in systemChat messages
Example 6:
{ if (_forEachIndex == 1) then { // Copilot _x addUniform "U_B_Soldier_VR"; } else { // Adams [_x, "B_Soldier_TL_F"] call BIS_fnc_loadInventory; _x addUniform "U_B_Soldier_VR"; _x setIdentity "Bootcamp_B_Adams"; }; } forEach _crew;

Additional Information

See also:
Control Structures for apply while select findIf count

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
Posted on July 20, 2010
Kronzky
If arrays are used in forEach loops, _x uses them by reference, so any changes to _x will be applied to the original: _arr1 = [1,2,3]; _arr2 = [6,7,8]; { _x set [1,"x"] } forEach [_arr1,_arr2]; will change _arr1 to [1,"x",3], and _arr2 to [6,"x",8].
Posted on January 2, 2015 - 22:35 (UTC)
Heeeere's Johnny!
Using exitWith inside a forEach loop will make forEach actually return something, namely whatever the exitWith returns: _result = { if(_x isEqualTo 3) exitWith {"Hello"} } forEach [1,2,3,4,5]; //_result = "Hello"
Posted on November 28, 2017 - 13:46 (UTC)
dedmen
Be careful when deleting (deleteAt) elements from an Array while you iterate over it.
_forEachIndex will not move to reflect your change.
The forEach code is doing the same as _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: _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.