Tags
2 dimensional, 2D, array, arrays, multi dimensional, ragged, redim, redim preserve, sparse, ubound, vbscript
After wasting lots of time on trial and error, I decided to find out what the low-level difference was between vbscript arrays addressed as (x,y) and (x)(y). Eric Lippert explained it better than I can, so just read his explanation. If you want some code to demonstrate how things work, download my 2D array test. It has a lot of in-line comments and should give you an idea of when you should use (x)(y) and when you should use (x,y).
(x)(y):
Use when you want to ReDim x and preserve the array contents.
Use when you want a sparse (or ragged) array.
Use for large 2D arrays that will be mostly empty.
(x,y):
Use when you don’t need to ReDim x.
Use for small 2D arrays that are created rectangular and have a structure that won’t change.
Use for large 2D arrays that will be fully populated with data.
Things to watch out for:
Dim array1(1,1) array1(1,0) = split("hello world"," ",-1,1)
Using the code above, “hello” is actually stored in array(1,0)(0), not array1(1,0). array1(1,0) actually contains a 2 element array! The way to get around this is use a temp array to store the output of the split function, then a for loop to copy data from the temp array into array1.
If you have a pre-defined set of data you want to collect (ex: computername,userid,timestamp,eventtype), then an array of objects may be easier to use, and easier to understand if someone else wants to read your code. A small example of an array of objects that took the place of a 2D array for a recent project:
Class AuditEvent Public ComputerName Public Username Public Timestamp Public EventType End Class Dim objAuditEvent() ReDim objAuditEvent(20) for i=0 to ubound(objAuditEvent) Set objAuditEvent(i) = New AuditEvent next objAuditEvent(1).ComputerName = "L210C99" objAuditEvent(1).Username = "user" objAuditEvent(1).Timestamp = "02/11/2008 12:00:17" objAuditEvent(1).EventType = "Logon" ReDim Preserve objAuditEvent(1) wscript.echo objAuditEvent(1).ComputerName 'Clean up objects for i=0 to ubound(objAuditEvent) Set objAuditEvent(i) = Nothing next
Glad I could help!