Editing Foreach

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
Added by NVSE 4. Used to repeat a script block for each entry in a collection. The collection may be either a container, [[Array Variable|array]] or [[String Variable|string]]. This can be a good alternative to using [[while]] or [[goto]] because it avoids infinite loop crash mistakes. However, be wary altering the size of the collection within the loop, as this may result in unexpected behavior.
{{Function
|origin = NVSE
|summary = Added by NVSE V4. Used to repeat a script block for each entry in an array. Each entry is itself a [[Array Variables|stringmap array]] with two fields, <b>"key"</b> and <b>"value"</b>.


Within foreach loops, the command <b>continue</b> may be used to skip any remaining loop code for that entry, and move on to the next. In the same context, the command <b>break</b> may be used to end the loop immediately, ignoring any remaining code and entries.
Within foreach loops, the command <b>continue</b> may be used to skip any remaining loop code for that entry, and move on to the next. In the same context, the command <b>break</b> may be used to end the loop immediately, ignoring any remaining code and entries.


==Syntax and Usage==
|name = Foreach
In the case of a container, an entry is a temporary reference to an item in its inventory. This means it may be used as a [[calling reference]], but becomes invalid once the loop ends. (See also: [[GetInvRefsForItem]], [[CopyIR]], [[RemoveMeIR]], [[IsEquipped]]).
|returnType = void
<pre>
|arguments =  
ref Item
  {{FunctionArgument
ref Container
  |Name = entry
foreach Item:tempref <- Container:ref
  |Type = array{{FunctionArgument
    ; Item is a temporary reference to an item in the container
  |Name = <-
loop
  |Type =
</pre>
  }}
 
  }}{{FunctionArgument
For an [[Array Variable|array]], each entry is a stringmap with two fields, <b>"key"</b> and <b>"value"</b>. The key is the index of the entry in the collection (0, 1, 2... for regular list arrays). (Note: you can replace 'entry["value"]' with the shorthand '*entry', see [[NVSE Expressions]])
  |Name = set
  |Type = array
  }}
}}
<pre>
<pre>
array_var SomeArray
array_var Entry
array_var Entry
array_var Collection


foreach Entry:array <- Collection:array
foreach Entry <- SomeArray
     ; Entry["key"] is the key (index) of each entry (0, 1, 2... for lists)
     ; Entry["key"] is the key (index) of each entry (0, 1, 2... for lists)
     ; Entry["value"] is the value of each entry in the array
     ; Entry["value"] is the value of each entry in the array
loop
</pre>
For a string, each entry is a string containing a single character.
<pre>
string_var Char
string_var Source
foreach Char:string <- Source:string
    ; Char is a single character in String
loop
loop
</pre>
</pre>


==Example==
==Example==
<pre>
ref rItem
ref rActor
foreach rItem <- rActor
  if rItem.IsEquipped
        rItem.UnequipMe
  endif
loop
; Will unequip all equipped items from rActor
</pre>
<pre>
<pre>
array_var Beatles
array_var Beatles
Line 97: Line 79:
</pre>
</pre>


You can also use the [[Ar_Range]] command to approximate the traditional 'C' style for loop. The code below prints the numbers 0-10:
You can also use the [[Ar_Range]] command to approximate the traditional 'C' style for loop. The code below [[Print|prints]] the numbers 0-10:
<pre>
<pre>
foreach Entry <- (Ar_Range 0, 10)
foreach entry <- (Ar_Range 0, 10)
     Print $Entry["value"]
     Print $entry["value"]
loop
loop
</pre>
</pre>
Note that above we reference <b>Entry["value"]</b> in the [[Print]] function directly, rather than use an intermediary variable (<b>let SomeVar := Entry["value"]..</b>). This is only possible when using NVSE aware functions or the [[Script Compiler Override]].


==See Also==
==See Also==
Line 111: Line 92:
*[[Eval]]
*[[Eval]]
*[[Label]]/[[Goto]]
*[[Label]]/[[Goto]]
*[[GetListForms]] (converts a form list to an array, so you can use foreach with it)
*[[NVSE Expressions]]
==External Links==
==External Links==
*[http://obse.silverlock.org/obse_command_doc.html#OBSE_Expressions List of supported expression found in OBSE, these are equivalent in NVSE]
*[http://obse.silverlock.org/obse_command_doc.html#OBSE_Expressions List of supported expression found in OBSE, these are equivalent in NVSE]
*[http://fallout.bethsoft.com/eng/links/privacyredirect.php?site=http://www.loverslab.com/topic/26749-tutorial-nvse4-part-1-syntax-and-expressions/ Tutorial on syntax and expressions in NVSE 4] (this link requires pre-setting user details for this site)
*[http://fallout.bethsoft.com/eng/links/privacyredirect.php?site=http://www.loverslab.com/topic/26749-tutorial-nvse4-part-1-syntax-and-expressions/ Tutorial on syntax and expressions in NVSE 4]
[[Category:Functions_(NVSE)]]
[[Category:Functions_(NVSE)]]
[[Category:Commands]]
[[Category:Commands]]
[[Category:Scripting]]
[[Category:Scripting]]

Please note that all contributions to the Fallout3 GECK Wiki are considered to be released under the Creative Commons Attribution-ShareAlike (see GECK:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)