What is the best way to iterate through an array in Classic Asp VBScript?


In the code below

For i = LBound(arr) To UBound(arr)

What is the point in asking using LBound? Surely that is always 0.

  • Translate

    Why not use For Each? That way you don't need to care what the LBound and UBound are.

    Dim x, y, z
    x = Array(1, 2, 3)
    For Each y In x
        z = DoSomethingWith(y)

  • Translate

    There is a good reason to NOT USE For i = LBound(arr) To UBound(arr)

    dim arr(10) allocates eleven members of the array, 0 through 10 (assuming the VB6 default Option Base).

    Many VB6 programmers assume the array is one-based, and never use the allocated arr(0). We can remove a potential source of bugs by using For i = 1 To UBound(arr) or For i = 0 To UBound(arr), because then it is clear whether arr(0) is being used.

    For each makes a copy of each array element, rather than a pointer.

    This has two problems.

    1. When we try to assign a value to an array element, it doesn't reflect on original. This code assigns a value of 47 to the variable i, but does not affect the elements of arr.

      arr = Array(3,4,8)
      for each i in arr
           i = 47
      next i
      Response.Write arr(0) '- returns 3, not 47

    2. We don't know the index of an array element in a for each, and we are not guaranteed the sequence of elements (although it seems to be in order.)

  • Translate

    LBound may not always be 0.

    Whilst it is not possible to create an array that has anything other than a 0 Lower bound in VBScript, it is still possible to retrieve an array of variants from a COM component which may have specified a different LBound.

    That said I've never come across one that has done anything like that.

  • Translate

    Probably it comes from VB6. Because with Option Base statement in VB6, you can alter the lower bound of arrays like this:

    Option Base 1

    Also in VB6, you can alter the lower bound of a specific array like this:

    Dim myArray(4 To 42) As String

  • Translate

    I've always used For Each...

  • Translate

    This is my approach:

    dim arrFormaA(15)
    arrFormaA( 0 ) = "formaA_01.txt"
    arrFormaA( 1 ) = "formaA_02.txt"
    arrFormaA( 2 ) = "formaA_03.txt"
    arrFormaA( 3 ) = "formaA_04.txt"
    arrFormaA( 4 ) = "formaA_05.txt"
    arrFormaA( 5 ) = "formaA_06.txt"
    arrFormaA( 6 ) = "formaA_07.txt"
    arrFormaA( 7 ) = "formaA_08.txt"
    arrFormaA( 8 ) = "formaA_09.txt"
    arrFormaA( 9 ) = "formaA_10.txt"
    arrFormaA( 10 ) = "formaA_11.txt"
    arrFormaA( 11 ) = "formaA_12.txt"
    arrFormaA( 12 ) = "formaA_13.txt"
    arrFormaA( 13 ) = "formaA_14.txt"
    arrFormaA( 14 ) = "formaA_15.txt"
    ''displays "15"
    For i = 0 To UBound(arrFormaA)-1

    Hope it helps.