forEach: Difference between revisions
Jump to navigation
Jump to search
Lou Montana (talk | contribs) m (Text replacement - " <!-- (DIS)?CONTINUE Notes -->" to "") |
(formatting) |
||
Line 1: | Line 1: | ||
{{RV|type=command | {{RV|type=command | ||
| ofp | |game1= ofp | ||
|version1= 1.00 | |||
|game2= ofpe | |||
|version2= 1.00 | |||
|game3= arma1 | |||
|version3= 1.00 | |||
|game4= arma2 | |||
|version4= 1.00 | |||
|game5= arma2oa | |||
|version5= 1.51 | |||
|game6= tkoh | |||
|version6= 1.00 | |||
|game7= arma3 | |||
|version7= 0.50 | |||
|gr1= Program Flow | |gr1= Program Flow | ||
| | |descr= Executes the given command(s) on every item of an array. In {{arma2}} and later, the variable [[Magic Variables#x|_x]] is always [[private]] to the [[forEach]] block so it is safe to nest them. | ||
| | |s1= code [[forEach]] array | ||
| code [[ | |p1= code: [[String]] in {{ofp}} and {{arma1}}, [[Code]] since {{arma1}} - The array item that is currently being iterated over is represented by <tt>[[Magic Variables#x|_x]]</tt>. The index of the current element is accessible via <tt>[[Magic Variables#_forEachIndex|_forEachIndex]]</tt> | ||
| | |p2= array: [[Array]] - The array to iterate over | ||
| | |r1= [[Anything]] - Will return the value of last executed statement | ||
| [[ | |s2= code [[forEach]] hashMap {{Since|arma3|2.02}} | ||
|p21= code: [[Code]] - Code applied to each key-value pair. The [[Magic Variables|Magic Variable]] <tt>[[Magic Variables#x|_x]]</tt> contains the key, <tt>[[Magic Variables#x|_y]]</tt> the value | |||
| | |||
|p22= hashMap : [[HashMap]] - The HashMap to iterate over | |||
| p22= hashMap : [[HashMap]] - The HashMap to iterate | |||
| r2= [[Anything]] - | |r2= [[Anything]] - Will return the value of last executed statement | ||
|x1= <code>{{cc|SQF}} | |x1= <code>{{cc|SQF}} | ||
{ [[Magic Variables#x|_x]] [[setDamage]] 1 } [[forEach]] [[units | { [[Magic Variables#x|_x]] [[setDamage]] 1 } [[forEach]] [[units]] [[player]];</code> | ||
<code>{{codecomment|; SQS}} | <code>{{codecomment|; SQS}} | ||
"[[Magic Variables#x|_x]] [[setDammage]] 1" [[forEach]] [[units | "[[Magic Variables#x|_x]] [[setDammage]] 1" [[forEach]] [[units]] [[player]]</code> | ||
|x2= This command can also easily be used to execute a single command multiple times without respect to the array items. | |x2= This command can also easily be used to execute a single command multiple times without respect to the array items. | ||
Line 47: | Line 65: | ||
|x4= To get the index of a [[forEach]] loop, use [[Magic Variables#forEachIndex|_forEachIndex]]: | |x4= To get the index of a [[forEach]] loop, use [[Magic Variables#forEachIndex|_forEachIndex]]: | ||
<code>{ [[systemChat]] [[ | <code>{ [[systemChat]] [[str]] _forEachIndex]; } [[forEach]] [1,2,3]; {{cc|will return: "0", "1", "2" in [[systemChat]] messages}}</code> | ||
|x5= Iterating a [[HashMap]] [[Magic Variables#forEachIndex|_forEachIndex]]: | |x5= Iterating a [[HashMap]] [[Magic Variables#forEachIndex|_forEachIndex]]: | ||
<code>{ [[systemChat]] [[format]] ["%1-%2", _x, _y]; } [[forEach]] createHashMapFromArray [[1,"a"], [2,"b"]]; {{cc|will return: "1-a", "2-b" in [[systemChat]] messages}}</code> | <code>{ [[systemChat]] [[format]] ["%1-%2", _x, _y]; } [[forEach]] [[createHashMapFromArray]] [[1,"a"], [2,"b"]]; {{cc|will return: "1-a", "2-b" in [[systemChat]] messages}}</code> | ||
|x6= <code>{ | |||
[[if]] ([[Magic Variables#forEachIndex|_forEachIndex]] == 1) [[then]] { | |||
{{cc|Copilot}} | |||
_x [[addUniform]] "U_B_Soldier_VR"; | |||
} [[else]] { | |||
{{cc|Adams}} | |||
[_x, "B_Soldier_TL_F"] [[call]] [[BIS_fnc_loadInventory]]; | |||
_x [[addUniform]] "U_B_Soldier_VR"; | |||
_x [[setIdentity]] "Bootcamp_B_Adams"; | |||
}; | |||
} [[forEach]] _crew;</code> | |||
|seealso= [[ | |seealso= [[Control Structures]] [[for]] [[apply]] [[while]] [[select]] [[findIf]] [[count]] | ||
}} | }} | ||
Line 65: | Line 95: | ||
{ [[Magic Variables#x|_x]] [[set]] [1,"x"] } [[forEach]] [_arr1,_arr2];</code> | { [[Magic Variables#x|_x]] [[set]] [1,"x"] } [[forEach]] [_arr1,_arr2];</code> | ||
will change _arr1 to [1,"x",3], and _arr2 to [6,"x",8]. | will change _arr1 to [1,"x",3], and _arr2 to [6,"x",8]. | ||
<dd class="notedate">Posted on January 2, 2015 - 22:35 (UTC)</dd> | <dd class="notedate">Posted on January 2, 2015 - 22:35 (UTC)</dd> | ||
<dt class="note">[[User:Heeeere's Johnny!|Heeeere's Johnny!]]</dt> | <dt class="note">[[User:Heeeere's Johnny!|Heeeere's Johnny!]]</dt> |
Revision as of 16:12, 3 May 2021
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 Flow
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
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.
Categories:
- Scripting Commands
- Introduced with Operation Flashpoint version 1.00
- Operation Flashpoint: New Scripting Commands
- Operation Flashpoint: Scripting Commands
- Operation Flashpoint: Elite: Scripting Commands
- ArmA: Armed Assault: Scripting Commands
- Arma 2: Scripting Commands
- Arma 2: Operation Arrowhead: Scripting Commands
- Take On Helicopters: Scripting Commands
- Arma 3: Scripting Commands
- Command Group: Program Flow