forEach: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
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


|1.00
|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.


| Executes the given command(s) on every item of an array.<br>
|s1= code [[forEach]] array
The array items are represented by the [[Magic Variables|magic variable]] '''[[Magic Variables#x|_x]]'''. The array indices are represented by '''[[Magic Variables#forEachIndex|_forEachIndex]]'''.<br>
In {{arma2}} and later, the variable [[Magic Variables#x|_x]] is always local to the [[forEach]] block so it is safe to nest them.<br>
{{Since|arma3|2.01|y}} the [[HashMap]] variant also provides a _y variable for the Value in the key-value pair.


| code [[forEach]] array
|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>


|p1= code:
|p2= array: [[Array]] - The array to iterate over
* [[String]] ({{ofp}}&nbsp;/&nbsp;{{arma1}})
* [[Code]] ({{arma1}} and later)


|p2= array: [[Array]] - the array to iterate
|r1= [[Anything]] - Will return the value of last executed statement


| [[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
| s2= code [[forEach]] hashMap


| p21= code: [[Code]]
|p22= hashMap : [[HashMap]] - The HashMap to iterate over
| p22= hashMap : [[HashMap]] - The HashMap to iterate through


| r2= [[Anything]] - will return the value of last executed statement
|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]] [[group]] [[player]];</code>
{ [[Magic Variables#x|_x]] [[setDamage]] 1 } [[forEach]] [[units]] [[player]];</code>
<code>{{codecomment|; SQS}}
<code>{{codecomment|; SQS}}
"[[Magic Variables#x|_x]] [[setDammage]] 1" [[forEach]] [[units]] [[group]] [[player]]</code>
"[[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]] [[format]] ["%1", _forEachIndex]; } [[forEach]] [1,2,3]; {{cc|will return: "0", "1", "2" in [[systemChat]] messages}}</code>
<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= [[set]], [[resize]], [[pushBack]], [[pushBackUnique]], [[apply]], [[reverse]], [[select]], [[in]], [[find]], [[findIf]], [[toArray]], [[toString]], [[count]], [[deleteAt]], [[deleteRange]], [[append]], [[sort]], [[param]], [[params]], [[arrayIntersect]], [[Control Structures]], [[splitString]], [[joinString]]
|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].
</dl>
[[Category:Scripting Commands|{{uc:{{PAGENAME}}}}]]
{{GameCategory|arma1|Scripting Commands}}
{{GameCategory|arma2|Scripting Commands}}
{{GameCategory|arma3|Scripting Commands}}
{{GameCategory|tkoh|Scripting Commands}}
<dl class="command_description">
<dt></dt>
<dd class="notedate">Posted on August 29, 2014 - 22:23 (UTC)</dd>
<dt class="note">[[User:Fett Li|Fett Li]]</dt>
<dd class="note">
[[forEach]] returns any (the last passed value will be the return value or just [[Nothing]], depends on the function called).
<code>_var = {_x} [[forEach]] [<nowiki/>[[nil]],"s",[[objNull]],[[configFile]] ]; {{cc|return bin\config.bin}}
_var = {_x [[setCaptive]] [[true]]} [[forEach]] [[allUnits]]; {{cc|return nothing}}</code>
</dd>
<dt><dt>
<dd class="notedate">Posted on September 20, 2014</dd>
<dt class="note">[[User:Mossarelli|Mossarelli]]</dt>
<dd class="note">
Using the foreach loop, since there are no variable for the index like say the for-do loop, there is a variable that you can use to check the index of the foreach loop.


<code>{
[[if]] ([[Magic Variables#forEachIndex|_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;
</code>
So when the array is past from _crew to the loop, index 1 (which is the second element) is the copilot of the "B_Heli_Light_01_F" and he will get "U_B_Soldier_VR" as a uniform. While the pilot which is index 0 (first element), will get the same uniform but will get the loadout of "B_Soldier_TL_F" and the identity of "Bootcamp_B_Adams".
</dd>
<dt><dt>
<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 17:12, 3 May 2021

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 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

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.