Difference between revisions of "ArraySerialize"
Jump to navigation
Jump to search
imported>QQuix m (Typos) |
imported>QQuix (See also) |
||
(One intermediate revision by the same user not shown) | |||
Line 3: | Line 3: | ||
'''Syntax:''' | '''Syntax:''' | ||
ArraySerialize | (SerialArray<sub> :array</sub>) ArraySerialize Array<sub> :array</sub>, Prefix<sub> :string</sub> | ||
Serializes a multi-dimensional array into a one-dimension StringMap array. | Serializes a multi-dimensional array into a one-dimension StringMap array. | ||
Line 36: | Line 37: | ||
==Notes== | ==Notes== | ||
*This function is designed to be used in conjunction with its sister function [[ArrayDeserialize]] | |||
*A serialized array is useful for storing array data in external media (like a Pluggy INI file) | *A serialized array is useful for storing array data in external media (like a Pluggy INI file) | ||
Line 47: | Line 50: | ||
==Usage== | ==Usage== | ||
Call ArraySerialize MyArray "" | let MySerialArray := Call ArraySerialize MyArray "" | ||
The first call should have a null 'Prefix' attribute (unless you want to prepend a literal to all your keys) | The first call should have a null 'Prefix' attribute (unless you want to prepend a literal to all your keys) | ||
Line 112: | Line 115: | ||
end | end | ||
==See Also== | ==See Also== | ||
* [[ArrayDeserialize]] | |||
* [[ArrayToINIsection]] | |||
* [[ArrayFromINIfile]] | |||
* [[User Functions]] | * [[User Functions]] | ||
Latest revision as of 22:22, 3 July 2010
A User Function for use with Oblivion Script Extender
Syntax:
(SerialArray :array) ArraySerialize Array :array, Prefix :string
Serializes a multi-dimensional array into a one-dimension StringMap array.
The arguments are:
- Array - the array to serialize
- Prefix - used in recursion
An array like this:
['EntryA'] = ['Attr1'] = 'A' = ['Attr2'] = = [0] = = = ['Value1'] = 11 = = = ['Value2'] = 22 = = [1] = = = ['Value1'] = 1111 = = = ['Value2'] = 2222 ['EntryB'] = ['Attr1'] = 'B' = = = . . . etc
Will become:
['EntryA_Attr1'] = 'A' ['EntryA_Attr1_0_Value1'] = 11 ['EntryA_Attr1_0_Value2'] = 22 ['EntryA_Attr1_1_Value1'] = 1111 ['EntryA_Attr1_1_Value2'] = 2222 ['EntryB_Attr1'] = 'B' . . . etc
Notes[edit | edit source]
- This function is designed to be used in conjunction with its sister function ArrayDeserialize
- A serialized array is useful for storing array data in external media (like a Pluggy INI file)
- Keys from Map type arrays will be formatted with a decimal point to differentiate them from Array type arrays when converting the serialized array back to its original multi-dimensional structure.
- The code uses the underscore ('_') as the concatenating char and assumes that it will not be present in any array key or value. Change it to another char if you have underscores in your arrays.
- The function is recursive, therefore limited to OBSE's maximum of 30 nested function calls.
Usage[edit | edit source]
let MySerialArray := Call ArraySerialize MyArray ""
The first call should have a null 'Prefix' attribute (unless you want to prepend a literal to all your keys)
Code[edit | edit source]
scriptname ArraySerialize array_var arInput array_var asEntry array_var asEntry2 array_var asSerial array_var asTemp string_var sKey string_var sPrefix begin Function {arInput sPrefix } ;=== Initialize the return array === let asSerial := ar_construct stringmap ;=== Concatenate the prefix === if eval sPrefix != "" let sPrefix := sPrefix + "_" endif foreach asEntry <- arInput ;=== Prepare current key === if eval (typeof asEntry[key]) == "String" let sKey := asEntry[key] elseif eval (typeof asEntry[key]) == "Number" let sKey := $asEntry[key] if eval (typeof arInput ) == "Map" if eval (sv_Find "." sKey ) < 0 let sKey := sKey + ".0" endif endif endif ;=== Append to prefix === let sKey := sPrefix + sKey ;=== Set the value=== if eval (typeof asEntry[value]) == "String" let asSerial[sKey] := asEntry[value] elseif eval (typeof asEntry[value]) == "Number" let asSerial[sKey] := asEntry[value] elseif eval (typeof asEntry[value]) == "Form" let asSerial[sKey] := asEntry[value] else ;=== Or serialize the next array level === let asTemp := call zuArraySerialize asEntry[value] sKey ;=== Add rntries to array === foreach asEntry2 <- asTemp let asSerial[asEntry2[key]] := asEntry2[value] loop endif loop SetFunctionValue asSerial sv_destruct sKey sPrefix end
See Also[edit | edit source]