select: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
(Add a hash b to see also)
m (Text replacement - "Killzone Kid" to "Killzone_Kid")
 
(97 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Command|= Comments
{{RV|type=command
____________________________________________________________________________________________


| ofp |= Game name
|game1= ofp
|version1= 1.00


|1.00|= Game version
|game2= ofpe
____________________________________________________________________________________________
|version2= 1.00


| Selects an element from an array, config entry from [[Config]] or substring from a string or a range from an array.|= Description
|game3= arma1
____________________________________________________________________________________________
|version3= 1.00


| array  '''select''' index |= Syntax
|game4= arma2
|version4= 1.00


| p1= array : [[Array]] |= Parameter 1
|game5= arma2oa
|version5= 1.50


| p2= index: [[Number]] - Index 0 denotes the first element, 1 the second, etc. If index has decimal places it gets rounded down for fractions less than or equal .5, otherwise it gets rounded up. |= Parameter 2
|game6= tkoh
|version6= 1.00


| [[Anything]] |= Return value
|game7= arma3
|version7= 0.50


____________________________________________________________________________________________
|gr1= Arrays


| s2= array  '''select''' boolean |= Syntax
|gr2= Strings


| p21= array : [[Array]] |= Parameter 1
|gr3= Config


| p22= boolean: [[Boolean]] - [[true]] => 1, [[false]] => 0|= Parameter 2
|descr= Selects an element from an array, config entry from [[Config]] or substring from a string or a range from an array.


| r2= [[Anything]] |= Return value
|s1= array [[select]] index


____________________________________________________________________________________________
|p1= array: [[Array]]


| s3= config  '''select''' index |= Syntax
|p2= index: [[Number]] - index 0 denotes the first element, 1 the second, etc. If index has decimal places it gets rounded down for fractions less than or equal .5, otherwise it gets rounded up.<br>
{{GVI|arma3|2.12|size= 0.75}} negative index can be used to select from the end of the array, i.e. -1 means last array element.


| p41= config : [[Config]] |= Parameter 1
|r1= [[Anything]] - a <u>reference</u> to the array element given by its index
{{Feature|important|When the index equals the size of the array, there is no error for out of range selection and [[nil]] is returned - see {{Link|#Example 8}}.}}


| p42= index: [[Number]] - Index 0 denotes the first element, 1 the second, etc. If index has decimal places it gets rounded down for fractions less than or equal .5, otherwise it gets rounded up.  |= Parameter 2
|s2= array [[select]] boolean


| r3= [[Config]] |= Return value
|p21= array: [[Array]]


____________________________________________________________________________________________
|p22= boolean: [[Boolean]] - [[false]] selects the '''first''' element of the [[Array]], [[true]] the '''second''' one


| s4= string '''select''' [start, length] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;''(since ["Arma 3","Arma3",127,126674,"Development"])'' |= Syntax
|r2= [[Anything]] - a <u>reference</u> to the array element


| p61= string: [[String]] |= Parameter 1
|s3= config [[select]] index


| p62= [start, length]: [[Array]] |= Parameter 2
|s3since= arma1 1.00


| p63= start: [[Number]] - String position to start selection from. 0 denotes the first character of the string, 1 the second, etc. If passed number has decimal places it gets rounded down for fractions less than or equal .5, otherwise it gets rounded up. |= Parameter 3
|p41= config: [[Config]]
| p64= length (optional): [[Number]] - Number of the string characters to select. If "length" is omitted, selection will be made from "start" to the end of the string. |= Parameter 4


| r4= [[String]] |= Return value
|p42= index: [[Number]] - index 0 denotes the first element, 1 the second, etc. If index has decimal places it gets rounded down for fractions less than or equal .5, otherwise it gets rounded up
____________________________________________________________________________________________


| s5= array '''select''' [start, count] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;''(since ["Arma 3","Arma3",131,127272,"Development"])''|= Syntax
|r3= [[Config]]


| p81= array: [[Array]] |= Parameter 1
|s4= string [[select]] [start, length]


| p82= [start, count]: [[Array]] |= Parameter 2
|s4since= arma3 1.28


| p83= start: [[Number]] - Array index to start selection from.|= Parameter 3
|p61= string: [[String]]
| p84= count: [[Number]] - Number of array elements to select. If the selected range exceeds source array boundaries, selection will be made up to the last element of the array. |= Parameter 4


| r5= [[Array]] |= Return value
|p62= start: [[Number]] - string position to start selection from. 0 denotes the first character of the string, 1 the second, etc. If passed number has decimal places it gets rounded down for fractions less than or equal .5, otherwise it gets rounded up
____________________________________________________________________________________________


| s6= array '''select''' expression &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;''(since ["Arma 3","Arma3",155,133771,"Development"])''|= Syntax
|p63= length: [[Number]] - (Optional, default ''string''<nowiki/>'s length) number of characters to select


| p101= array: [[Array]] |= Parameter 1
|r4= [[String]]
{{Feature|informative|Substring version of [[select]] operates with the ANSI charset; if Unicode support is desired, see [[forceUnicode]].}}


| p102= expression: [[Code]] - expression that is expected to return [[Boolean]] or [[Nothing]]. If [[true]] is returned, the original array value of currently tested element [[_x]] will be added to the output array |= Parameter 2
|s5= array [[select]] [start, count]


| r6= [[Array]] - array of all elements from the original array that satisfied expression condition |= Return value
|s5since= arma3 1.32
____________________________________________________________________________________________
 
 
|x1= <code>[1,2,3,4] [[select]] 2; //result is 3
[[position]] [[player]] [[select]] 2; //result is Z coordinate of player position</code>|= Example 1


|x2= <code>["", [[currentWeapon]] [[player]]] [[select]] [[alive]] [[player]]; //if dead "" is selected</code>|= Example 2
|p81= array: [[Array]]


|x3= <code>([[configFile]] >> "cfgVehicles" >> [[typeOf]] [[vehicle]] [[player]] >> "Turrets") [[select]] 0 >> "gunnerAction";</code>|= Example 3
|p82= start: [[Number]] - array index to start selection from


|p83= count: [[Number]] - ({{GVI|arma3|2.14|size= 0.75}} Optional) number of array elements to select. If the selected range exceeds source array boundaries, selection will be made up to the last element of the array.
{{Feature|informative|Since v2.14 'count' is optional, if omitted the selection is made from ''start'' until the end of the array.}}


|x4= <code>[[hint]] [[str]] ("japa is the man!" [[select]] [8]); //the man!
|r5= [[Array]] - a <u>new array</u> from selection
[[hint]] [[str]] ("japa is the man!" [[select]] [0,7]); //japa is</code>|= Example 4


|x5= <code>[[hint]] [[str]] ([1,2,3,4,5,6] [[select]] [1,4]); //[2,3,4,5]</code>|= Example 5
|s6= array [[select]] expression


|x6= <code>_even = [1,2,3,4,5,6,7,8,9,0] [[select]] {_x%2 == 0}; // returns [2, 4, 6, 8, 0]</code>|= Example 6
|s6since= arma3 1.56
____________________________________________________________________________________________


| [[a hash b]], [[selectRandom]], [[selectRandomWeighted]], [[set]], [[resize]], [[reverse]], [[in]], [[find]], [[findIf]], [[toArray]], [[toString]], [[forEach]], [[count]], [[deleteAt]], [[deleteRange]], [[append]], [[sort]], [[param]], [[params]], [[splitString]], [[joinString]], [[pushBack]], [[pushBackUnique]], [[apply]]|= SEEALSO
|p101= array: [[Array]]


|p102= expression: [[Code]] - expression that is expected to return [[Boolean]] or [[Nothing]].
If [[true]] is returned, the original array value of currently tested element [[Magic Variables#x|_x]] will be added to the output array
|r6= [[Array]] - a <u>new array</u> of all elements from the original array that satisfied expression condition
|x1= <sqf>
["a", "b", "c", "d"] select 2; // result is "c"
position player select 2; // result is Z coordinate of player position
</sqf>
|x2= <sqf>["", currentWeapon player] select alive player; // if player is dead, "" is selected</sqf>
|x3= <sqf>(configFile >> "cfgVehicles" >> typeOf vehicle player >> "Turrets") select 0 >> "gunnerAction";</sqf>
|x4= <sqf>
hint str ("japa is the man!" select [8]); // the man!
hint str ("japa is the man!" select [0, 7]); // japa is
</sqf>
|x5= <sqf>hint str ([1,2,3,4,5,6] select [1, 4]); // [2,3,4,5]</sqf>
|x6= <sqf>_even = [1,2,3,4,5,6,7,8,9,0] select { _x % 2 == 0 }; // returns [2, 4, 6, 8, 0]</sqf>
|x7= JavaScript endsWith() alternative:
<sqf>
private _fnc_endsWith =
{
params ["_string", "_endswith"];
_string select [count _string - count _endswith] isEqualTo _endswith
};
["Arma 3", "3"] call _fnc_endsWith; // true
["Arma 3", "4"] call _fnc_endsWith; // false
</sqf>
<!-- referenced in r1 -->
|x8= [[select]] index traps:
<sqf>
private _array = ["a", "b", "c", "d"];
_array select 0; // "a"
_array select 3; // "d"
_array select 4; // nil - no error shown
_array select 5; // error
// can sometimes be useful
private _firstEnemyNearMe = allUnits opfor select { player distance _x < 10 } select 0; // nil if no enemies nearby
if (isNil _firstEnemyNearMe) exitWith { systemChat "no enemy found" };
systemChat format ["enemy found: %1", name _firstEnemyNearMe];
// get the last element properly
_array select (count _array); // wrong - nil is returned
_array select (count _array - 1); // correct - "d" is returned
</sqf>
|seealso= [[a hash b|#]] [[selectRandom]] [[selectRandomWeighted]] [[set]] [[resize]] [[reverse]] [[in]] [[find]] [[findIf]] [[toArray]] [[toString]] [[forEach]] [[count]] [[deleteAt]] [[deleteRange]] [[append]] [[sort]] [[param]] [[params]] [[splitString]] [[joinString]] [[pushBack]] [[pushBackUnique]] [[apply]] [[forceUnicode]]
}}
}}


<h3 style="display:none">Notes</h3>
{{Note
<dl class="command_description">
|user= General Barron
<!-- Note Section BEGIN -->
|timestamp= 20090303020200
<dd class="notedate">Posted on 3 March 2009
|text= When combined with the [[count]] command, this can be used to read all entries out of a config; even when you don't know exactly how many entries there will be.
<dt class="note">'''[[User:General Barron|General Barron]]'''<dd class="note">
See the notes under [[count]] for more info.
When combined with the [[count]] command, this can be used to read all entries out of a config; even when you don't know exactly how many entries there will be. See the notes under [[count]] for more info.
}}
<dd class="notedate">Posted on 27 Sep, 2013
<dt class="note">'''[[User:Killzone_Kid|Killzone_Kid]]'''<dd class="note">Rounding of fractions with [[select]] is not the same as when you use [[round]] command:
<code>_roundThis = 0.5;
[[hint]] [[str]] ([0,1] [[select]] _roundThis); //0
[[hint]] [[str]] [[round]] _roundThis; //1</code>
<dd class="notedate">Posted on 30 May, 2014 - 1549
<dt class="note">'''[[User:ffur2007slx2_5|ffur2007slx2_5]]'''<dd class="note">
In ArmA3 ver 1.18, [[Boolean]] type supported. Which [[true]] defaulted as 1 and [[false]] as 0.
<code>[0,1] [[select]] (56 > 40) // 1
[0,1,2] [[select]] ((![[isNil]] "v") && [[false]]) // 0</code>
<dd class="notedate">Posted on 14 juil, 2016
<dt class="note">'''[[User:Pierre MGI|Pierre MGI]]'''<dd class="note">You can substract array from array using select:
<code>_array = [[1],[2],[3]]; _sub = [2];
_array - _sub //  [[1],[2],[3];
_array [[select]] {!(_x [[isEqualTo]] _sub)} // [[1],[3]];
[[1],[2],[2],[2],[2],[3]] [[select]] {!(_x [[isEqualTo]] _sub)} // [[1],[3]];
</code>
</dd>
</dl>
<!-- Note Section END -->


<h3 style="display:none">Bottom Section</h3>
{{Note
[[Category:Scripting Commands|SELECT]]
|user= Killzone_Kid
[[Category:Scripting Commands OFP 1.99|{{uc:{{PAGENAME}}}}]]
|timestamp= 20130928005300
[[Category:Scripting Commands OFP 1.96|SELECT]]
|text= Rounding of fractions with [[select]] is not the same as when you use [[round]] command:
[[Category:Scripting Commands OFP 1.46|SELECT]]
<sqf>
[[Category:Scripting Commands ArmA|SELECT]]
_roundThis = 0.5;
[[Category:Command_Group:_Variables|{{uc:{{PAGENAME}}}}]]
hint str ([0,1] select _roundThis); // 0
[[Category:Scripting Commands ArmA2|{{uc:{{PAGENAME}}}}]]
hint str ([0,1] select round _roundThis); // 1
[[Category:Scripting Commands Arma 3|{{uc:{{PAGENAME}}}}]]
</sqf>
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]
}}


<!-- CONTINUE Notes -->
{{Note
<dl class="command_description">
|user= Pierre MGI
<dd class="notedate">Posted on June 22, 2015 - 23:23 (UTC)</dd>
|timestamp= 20160714041800
<dt class="note">[[User:Killzone Kid|Killzone Kid]]</dt>
|text= You can substract array from array using select:
<dd class="note">
<sqf>
Usually when select tries to pick up element out of range, Arma throws "division by zero" error. However there are exceptions. Basically as long as index of element you are selecting is less then or equal to array size, you will get no error.
_array = [[1], [2], [3]];
<code>[] [[select]] 0; //ok, result is nil
_sub = [2];
[1,2,3] [[select]] 3; //ok, result is nil
_array - _sub; // [[1], [2], [3]]
[1,2,3] [[select]] 4; //division by zero</code>
_array select { !(_x isEqualTo _sub) }; // [[1], [3]]
</dd>
[[1],[2],[2],[2],[2],[3]] select { !(_x isEqualTo _sub) }; // [[1], [3]]
</dl>
</sqf>
<!-- DISCONTINUE Notes -->
}}


<!-- CONTINUE Notes -->
{{Note
<dl class="command_description">
|user= Commy2
<dd class="notedate">Posted on November 12, 2016 - 22:36 (UTC)</dd>
|timestamp= 20161112223600
<dt class="note">[[User:Commy2|Commy2]]</dt>
|text= It is not safe to escape the code block of alternative syntax #5 with [[exitWith]], [[breakOut]] etc:
<dd class="note">
<sqf>
It is not safe to escape the code block of alternative syntax #5 with exitWith, breakOut etc.<br>
x3 = [1,2,3,4,5] select {
<code>x3 = [1,2,3,4,5] select {  
if (_x == 3) exitWith
    if (_x == 3) exitWith {  
{
        false;  
false;
    };  
};
    true  
true
};
};
// could be expected to be: x3 = [1,2,4,5]
// could be expected to be: x3 = [1,2,4,5]
// actual result: x3 = false
// actual result: x3 = false
</code>
</sqf>
</dd>
}}
</dl>
<!-- DISCONTINUE Notes -->


<!-- CONTINUE Notes -->
{{Note
<dl class="command_description">
|user= Igneous01
<dd class="notedate">Posted on February 14, 2017 - 16:26 (UTC)</dd>
|timestamp= 20170214162600
<dt class="note">[[User:Igneous01|Igneous01]]</dt>
|text= {{Link|#Syntax 5}} is the equivalent of passing in a predicate that returns a boolean. In SQF, a piece of code will always return what the last executed command returned.
<dd class="note">
<sqf>
Syntax #5 is the equivalent of passing in a predicate that returns a boolean. In SQF, a piece of code will always return what the last executed command returned.
myAliveUnits = allUnits select { alive _x }; // alive returns a boolean, the last statement run was alive _x,
<code>
// therefore this piece of code will return a true/false to the select command
myAliveUnits = allunits select {alive _x;}; // alive returns a boolean, the last statement run was alive _x, therefore this piece of code will return a true/false to the select command
myEastGroups = allGroups select { side _x == east }; // returns all east groups
myEastGroups = allgroups select {side _x == EAST;}; // returns all groups that are side EAST
my4ManGroups = allGroups select { count units _x == 4 }; // returns all groups that have 4 men in them
my4ManGroups = allgroups select { count (units _x) == 4;}; // returns all groups that have 4 men in them
unitsThatDetectedMe = allUnits select { _x knowsAbout player > 0.1 }; // returns a list of units that have detected the player
UnitsThatDetectedMe = allunits select {_x knowsAbout player > 0.1;}; // returns a list of units that have detected the player
</sqf>
</code>
}}
</dd>
</dl>
<!-- DISCONTINUE Notes -->
 
<!-- CONTINUE Notes -->
<dl class="command_description">
<dd class="notedate">Posted on May 28, 2017 - 13:51 (UTC)</dd>
<dt class="note">[[User:IT07|IT07]]</dt>
<dd class="note">
Very simple example of how to report about the status of the player:
<code>[ "Player is dead.", "Player is alive" ] select ( alive player )</code>
returns "Player is alive" because ( alive player ) returned true. If ( alive player ) returned false, the first element (0)
would have been returned.
That is a great way of reporting about something without having to write a complicated it then else statement.
</dd>
</dl>
<!-- DISCONTINUE Notes -->
 
<!-- CONTINUE Notes -->
<dl class="command_description">
<dd class="notedate">Posted on April 14, 2018 - 13:06 (UTC)</dd>
<dt class="note">[[User:bloodwyn1756|bloodwyn1756]]</dt>
<dd class="note">
Since 1.82 "#" symbol can be used to select from an array. It's shorter to write and has higher priority than math functions.
</dd>
</dl>
<!-- DISCONTINUE Notes -->

Latest revision as of 14:48, 12 March 2024

Hover & click on the images for description

Description

Description:
Selects an element from an array, config entry from Config or substring from a string or a range from an array.
Groups:
ArraysStringsConfig

Syntax 1

Syntax:
array select index
Parameters:
array: Array
index: Number - index 0 denotes the first element, 1 the second, etc. If index has decimal places it gets rounded down for fractions less than or equal .5, otherwise it gets rounded up.
Arma 3 logo black.png2.12 negative index can be used to select from the end of the array, i.e. -1 means last array element.
Return Value:
Anything - a reference to the array element given by its index
When the index equals the size of the array, there is no error for out of range selection and nil is returned - see Example 8.

Syntax 2

Syntax:
array select boolean
Parameters:
array: Array
boolean: Boolean - false selects the first element of the Array, true the second one
Return Value:
Anything - a reference to the array element

Syntax 3

Syntax:
config select index
Parameters:
config: Config
index: Number - index 0 denotes the first element, 1 the second, etc. If index has decimal places it gets rounded down for fractions less than or equal .5, otherwise it gets rounded up
Return Value:
Config

Syntax 4

Syntax:
string select [start, length]
Parameters:
string: String
start: Number - string position to start selection from. 0 denotes the first character of the string, 1 the second, etc. If passed number has decimal places it gets rounded down for fractions less than or equal .5, otherwise it gets rounded up
length: Number - (Optional, default string's length) number of characters to select
Return Value:
String
Substring version of select operates with the ANSI charset; if Unicode support is desired, see forceUnicode.

Syntax 5

Syntax:
array select [start, count]
Parameters:
array: Array
start: Number - array index to start selection from
count: Number - (Arma 3 logo black.png2.14 Optional) number of array elements to select. If the selected range exceeds source array boundaries, selection will be made up to the last element of the array.
Since v2.14 'count' is optional, if omitted the selection is made from start until the end of the array.
Return Value:
Array - a new array from selection

Syntax 6

Syntax:
array select expression
Parameters:
array: Array
expression: Code - expression that is expected to return Boolean or Nothing. If true is returned, the original array value of currently tested element _x will be added to the output array
Return Value:
Array - a new array of all elements from the original array that satisfied expression condition

Examples

Example 1:
["a", "b", "c", "d"] select 2; // result is "c" position player select 2; // result is Z coordinate of player position
Example 2:
["", currentWeapon player] select alive player; // if player is dead, "" is selected
Example 3:
(configFile >> "cfgVehicles" >> typeOf vehicle player >> "Turrets") select 0 >> "gunnerAction";
Example 4:
hint str ("japa is the man!" select [8]); // the man! hint str ("japa is the man!" select [0, 7]); // japa is
Example 5:
hint str ([1,2,3,4,5,6] select [1, 4]); // [2,3,4,5]
Example 6:
_even = [1,2,3,4,5,6,7,8,9,0] select { _x % 2 == 0 }; // returns [2, 4, 6, 8, 0]
Example 7:
JavaScript endsWith() alternative:
private _fnc_endsWith = { params ["_string", "_endswith"]; _string select [count _string - count _endswith] isEqualTo _endswith }; ["Arma 3", "3"] call _fnc_endsWith; // true ["Arma 3", "4"] call _fnc_endsWith; // false
Example 8:
select index traps:
private _array = ["a", "b", "c", "d"]; _array select 0; // "a" _array select 3; // "d" _array select 4; // nil - no error shown _array select 5; // error // can sometimes be useful private _firstEnemyNearMe = allUnits opfor select { player distance _x < 10 } select 0; // nil if no enemies nearby if (isNil _firstEnemyNearMe) exitWith { systemChat "no enemy found" }; systemChat format ["enemy found: %1", name _firstEnemyNearMe]; // get the last element properly _array select (count _array); // wrong - nil is returned _array select (count _array - 1); // correct - "d" is returned

Additional Information

See also:
# selectRandom selectRandomWeighted set resize reverse in find findIf toArray toString forEach count deleteAt deleteRange append sort param params splitString joinString pushBack pushBackUnique apply forceUnicode

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
General Barron - c
Posted on Mar 03, 2009 - 02:02 (UTC)
When combined with the count command, this can be used to read all entries out of a config; even when you don't know exactly how many entries there will be. See the notes under count for more info.
Killzone_Kid - c
Posted on Sep 28, 2013 - 00:53 (UTC)
Rounding of fractions with select is not the same as when you use round command:
_roundThis = 0.5; hint str ([0,1] select _roundThis); // 0 hint str ([0,1] select round _roundThis); // 1
Pierre MGI - c
Posted on Jul 14, 2016 - 04:18 (UTC)
You can substract array from array using select:
_array = [[1], [2], [3]]; _sub = [2]; _array - _sub; // [[1], [2], [3]] _array select { !(_x isEqualTo _sub) }; // [[1], [3]] [[1],[2],[2],[2],[2],[3]] select { !(_x isEqualTo _sub) }; // [[1], [3]]
Commy2 - c
Posted on Nov 12, 2016 - 22:36 (UTC)
It is not safe to escape the code block of alternative syntax #5 with exitWith, breakOut etc:
x3 = [1,2,3,4,5] select { if (_x == 3) exitWith { false; }; true }; // could be expected to be: x3 = [1,2,4,5] // actual result: x3 = false
Igneous01 - c
Posted on Feb 14, 2017 - 16:26 (UTC)
Syntax 5 is the equivalent of passing in a predicate that returns a boolean. In SQF, a piece of code will always return what the last executed command returned.
myAliveUnits = allUnits select { alive _x }; // alive returns a boolean, the last statement run was alive _x, // therefore this piece of code will return a true/false to the select command myEastGroups = allGroups select { side _x == east }; // returns all east groups my4ManGroups = allGroups select { count units _x == 4 }; // returns all groups that have 4 men in them unitsThatDetectedMe = allUnits select { _x knowsAbout player > 0.1 }; // returns a list of units that have detected the player