forEach: Difference between revisions
Jump to navigation
Jump to search
Lou Montana (talk | contribs) (Some wiki formatting) |
Lou Montana (talk | contribs) m (Some wiki formatting) |
||
Line 52: | Line 52: | ||
|r2= [[Anything]] - Will return the value of last executed statement | |r2= [[Anything]] - Will return the value of last executed statement | ||
|x1= < | |x1= <sqf> | ||
{ | // SQF | ||
< | { _x setDamage 1 } forEach units player; | ||
" | </sqf> | ||
<sqf> | |||
"SQS" | |||
"_x setDammage 1" forEach units player | |||
</sqf> | |||
|x2= This command can also easily be used to execute a single command multiple times without respect to the array items - see also [[for]] | |x2= This command can also easily be used to execute a single command multiple times without respect to the array items - see also [[for]] | ||
< | <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" }; | |||
</sqf> | |||
|x3= You can also use multiple commands in the same block: | |x3= You can also use multiple commands in the same block: | ||
< | <sqf> | ||
{ | |||
_x setCaptive true; | |||
removeAllWeapons _x; | |||
} | doStop _x; | ||
} forEach units group this; | |||
</sqf> | |||
|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]]: | ||
< | <sqf>{ systemChat str _forEachIndex; } forEach ["a", "b", "c"]; // will return: "0", "1", "2" in systemChat messages</sqf> | ||
|x5= Iterating a [[HashMap]]'s [[Magic Variables#forEachIndex|_forEachIndex]]: | |x5= Iterating a [[HashMap]]'s [[Magic Variables#forEachIndex|_forEachIndex]]: | ||
< | <sqf> | ||
// shows "0, k1, v1", "1, k2, v2" in systemChat messages | |||
{ | { | ||
systemChat format ["%1, %2, %3", _forEachIndex, _x, _y]; | |||
} | } forEach createHashMapFromArray [ | ||
["k1", "v1"], | ["k1", "v1"], | ||
["k2", "v2"] | ["k2", "v2"] | ||
];</ | ]; | ||
</sqf> | |||
|x6= [[findIf]] equivalent for [[HashMap]]:< | |x6= [[findIf]] equivalent for [[HashMap]]: | ||
<sqf> | |||
private _resultKey = { | |||
if (_y isEqualTo "wantedValue") exitWith { _x }; | |||
"" | "" | ||
} | } forEach _hashmap; | ||
</sqf> | |||
|x7= Array is edited by reference: | |x7= Array is edited by reference: | ||
< | <sqf> | ||
_arr1 = [1,2,3]; | |||
_arr2 = [6,7,8]; | _arr2 = [6,7,8]; | ||
_arr3 = [0]; | _arr3 = [0]; | ||
{ | { _x set [1, "changed"] } forEach [_arr1, _arr2, _arr3]; | ||
// _arr1 = [1, "changed", 3] | |||
// _arr2 = [6, "changed", 8] | |||
// _arr3 = [0, "changed"] | |||
</sqf> | |||
|x8= < | |x8= <sqf> | ||
{ | |||
private _verticalValue = _x; // needed, otherwise _horizontalValues' _x made this one inaccessible | |||
{ | { | ||
[_x, _verticalValue] | [_x, _verticalValue] call TAG_fnc_doSomething; | ||
} | } forEach _horizontalValues; | ||
} | } forEach _verticalValues; | ||
</sqf> | |||
|seealso= [[Control Structures]] [[for]] [[apply]] [[while]] [[select]] [[findIf]] [[count]] | |seealso= [[Control Structures]] [[for]] [[apply]] [[while]] [[select]] [[findIf]] [[count]] | ||
Line 106: | Line 123: | ||
{{Note | {{Note | ||
|user= | |user= Dedmen | ||
|timestamp= 20171128134600 | |timestamp= 20171128134600 | ||
|text= Be careful when deleting ([[deleteAt]]) elements from an Array while you iterate over it.<br> | |text= Be careful when deleting ([[deleteAt]]) elements from an Array while you iterate over it.<br> | ||
Line 112: | Line 129: | ||
The forEach code is doing the same as | The forEach code is doing the same as | ||
< | <sqf> | ||
private _forEachIndex = 0; | |||
while { _forEachIndex < count _array } do | |||
{ | { | ||
(_array | (_array select _forEachIndex) call code; | ||
_forEachIndex = _forEachIndex + 1; | |||
}</ | }; | ||
</sqf> | |||
So if you delete your current element from the array the other elements will shift forward. Meaning you skip one element.<br> | So if you delete your current element from the array the other elements will shift forward. Meaning you skip one element.<br> | ||
Example: | Example: | ||
< | <sqf> | ||
{ _array | _array = [1,2,3,4,5,6]; | ||
{ _array deleteAt _forEachIndex } forEach _array; | |||
</sqf> | |||
After the first iteration your Array will be [2,3,4,5,6] and the _forEachIndex will be 1.<br> | After the first iteration your Array will be [2,3,4,5,6] and the _forEachIndex will be 1.<br> | ||
So on next iteration you get the element at index 1 which will be 3. So you've just skipped the 2.<br> | So on next iteration you get the element at index 1 which will be 3. So you've just skipped the 2.<br> | ||
So in the end you will only iterate over 1,3 and 6. | So in the end you will only iterate over 1, 3 and 6. | ||
}} | }} |
Revision as of 21:50, 18 April 2022
Description
- Description:
- Executes the given command(s) on every item of an Array or a HashMap.
- Groups:
- Program FlowArraysHashMap
Syntax
- Syntax:
- code forEach array
- Parameters:
- code: String in Operation Flashpoint and Armed Assault, Code since Armed Assault - available variables:
- _x: iterated item
- _forEachIndex: item's index
- array: Array - The array to iterate over
- Return Value:
- Anything - Will return the value of last executed statement
Alternative Syntax
- Syntax:
- code forEach hashMap
- Parameters:
- code: Code - code applied to each key-value pair - available variables:
- _x: key
- _y: value
- _forEachIndex: iteration number
- hashMap : HashMap - The HashMap to iterate over
- Return Value:
- Anything - Will return the value of last executed statement
Examples
- Example 1:
- 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
{ 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:
- Example 4:
- To get the index of a forEach loop, use _forEachIndex:
{ systemChat str _forEachIndex; } forEach ["a", "b", "c"]; // will return: "0", "1", "2" in systemChat messages
- Example 5:
- Iterating a HashMap's _forEachIndex:
// 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 equivalent for HashMap:
- Example 7:
- Array is edited by reference:
- Example 8:
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 Nov 28, 2017 - 13:46 (UTC)
-
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 asSo if you delete your current element from the array the other elements will shift forward. Meaning you skip one element.private _forEachIndex = 0; while { _forEachIndex < count _array } do { (_array select _forEachIndex) call code; _forEachIndex = _forEachIndex + 1; };
Example: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
- Command Group: Arrays
- Command Group: HashMap