В этой стать мы изучим vbscript массивы и функции для работы с ними. Массивы языка vbscript могут быть как одномерными, так и многомерными, нумерация элементов массива начинается с нуля. Если не прибегать к дополнительным функциям, то объявление массива в языке vbscript подобно объявлению переменной, только после имени переменной следуют круглые скобки. Если в круглых скобках ничего нет, то массив является динамическим – его длину можно изменять.
Вот простые примеры:
dim my_arr(10) '11 элементов dim my_matrix(3,4) ' матрица размером 4 (строки) на 5 (столбцов) dim my_dyn() 'динамический |
Присвоение значений производится через индекс:
my_arr(0) = 100
my_arr(1) = "строка"
my_arr(2) = #10/05/2000#
my_matrix(0,0) = 25
my_matrix(0,1) = 250
my_matrix(2,3) = 2.5
|
Если мы объявили динамический массив vbscript, то для подальшего определения его размера служит ключевое слово ReDim:
ReDim my_dyn(50)
|
Вы вправе менять размерность неограниченное количество раз. Что бы произвести сохранение уже имеющейся информации используется ключевое слово Preserve:
ReDimPreserve my_dyn(80) |
Что бы полностью очистить содержимое, применяется команда Erase:
Erase my_matrix |
Но как вы уже заметили, приведенный выше подход не совсем практичен, особенно, в плане назначения значений, поэтому, давайте рассмотрим функции для работы с массивами языка vbscript.
Array(arglist) – В качестве параметра arglist передаются аргументы массива, которые разделены между собой запятыми, например:
'***************************************** ' vbscript массивы ' array_1.vbs '***************************************** Option Explicit dim new_arr(4), i, s dim my_arr, index, list new_arr(0) = 0 new_arr(1) = "строка" new_arr(2) = 33.5 new_arr(3) = 100 new_arr(4) = #10/05/2000# for each i in new_arr s = s & i & vbCrLf next MsgBox s my_arr = Array(0,"строка",33.5,100,#10/05/2000#) for each index in my_arr list = list & index & vbCrLf next MsgBox list |
В данном примере мы создали два vbscript массива: new_arr – обычным способом и my_arr – с помощью функции Array, второй подход более эффективен, так как экономит строки кода.
IsArray(varname) – Данная функция позволяет определить, является ли переменная varname массивом, если да, то функция вернет true, и false в противном случае.
UBound (имяМассива [, измерение]) — Позволяет определить верхнюю границу массива (имяМассива), параметр [,измерение] не является обязательным, он актуален в том случае, если происходит работа с многомерными. Параметры [,измерение] принимает целые значения, начиная от 1, по умолчанию параметр [, измерение] равен 1. Пример:
'***************************************** ' vbscript массивы ' функция UBound ' UBound.vbs '***************************************** Option Explicit dim matrix(2,3) dim a, b matrix(0,0) = 2 matrix(0,1) = 4 matrix(0,2) = 5 matrix(1,0) = 4 matrix(1,1) = 5 matrix(1,2) = 99 matrix(1,3) = 6 a = UBound(matrix,1) b = UBound(matrix, 2) MsgBox a MsgBox b MsgBox matrix(1,2) |
LBound(arrayname[, dimension]) – Аналог предыдущей функции, но выводит нижнюю границу.
Хорошо, теперь давайте рассмотри более серьезные виды массивов языка vbscript.
Массив массивов – такого вида конструкция может привести новичка в заблуждение, и он подумает, что перед ним двумерный, хотя это ошибка, смотрим на пример:
'***************************************** ' vbscript массивы ' array_2.vbs '***************************************** Option Explicit dim new_arr, s, i,j dim a, b s="" ' Это не двумерный!!! new_arr = Array(Array(2,4,5), Array(8,5,99,6)) for i=0 to 2 s=s & " " & new_arr(0)(i) next s=s & vbCrlf for j=0 to 3 s=s & " " & new_arr(1)(j) next MsgBox s |
В данном примере vbscript массив new_arr является одномерным и состоит из двух значений, при чем, каждое значение является также одномерным массивом. Видим, что в предыдущем примере мы использовали синтаксис вида: matrix(1,2), а тут — new_arr(1)(j). Различие, как говорится – на лицо.
Функция в качестве значения. Может возникнуть ситуация, когда надо сохранить не просто значение, а функцию, вот тут то и происходит головная боль. Давайте взглянем на следующий пример:
'***************************************** ' vbscript массивы ' вызов функции ' array_3.vbs '***************************************** dim new_arr(4), i, s function new_fun(x,y) new_fun=x+y end function function new_fun_1(x,y) new_fun_1=x+y end function new_arr(0) = 0 new_arr(1) = "строка" 'Создаем ссылку на функцию set new_arr(2) = getref("new_fun") ' Так делать неправильно new_arr(3) = new_fun_1(x,y) new_arr(4) = #10/05/2000# MsgBox new_arr(2)(10,5) ' Ошибка!!! MsgBox new_arr1(2)(10,5) |
В данном примере мы объявили две функции, мы попробовали определить их в качестве параметра массива. В первом случае (new_fun_1) мы просто присвоили имя функции:
new_arr(3) = new_fun_1(x,y) |
Вторую функцию (new_fun) мы присвоили с помощью ключевого слова set и функции getref().
Попытка вызвать первую функцию приводит к ошибке, вторая – прекрасно вызывается с передачей ей параметров. Давайте разберёмся, в чем причина. В первом случае индекс массива vbscript содержит функцию, как значение – без параметров, оно равно 0, поэтому мы не может её вызвать. Во втором случае мы создали ссылку (set) на нужную функцию, сама ссылка получена за счёт функции getref().
Ладно, думаю, изучение vbscript массивов на этом можно закончить.
Владимир, у меня вот такая проблема:
Происходит парсинг XML в двумерный массив (успешно)
….
array(0,1)=’ID’
array(1,1)=123444
array(0,2)=’Version’
array(1,2)=2
Размерность массива array(1,78).
Задача:
Необходимо найти в массиве значение для поля ID и передать ее в переменную.
Что то с алгоритмом никак не могу разобраться:
For i=LBound(array,1) to Ubound (array,1)
For j=Lbound(array,1) to Ubound(array,1)
If array(0,j)=’ID’ Then
ID=array(1,j)
End If
MsgBox ‘New ID is:’ & array(1,j) , 64
Next
Next
это не работает.
dim array(78,1)
dim ID
ID=’ ‘
array(0,0)=’ID’
array(0,1)=123444
array(1,0)=’Version’
array(1,1)=2
array(2,0)=’ID’
array(2,1)=22.5
For i=LBound(array,1) to Ubound (array,1)
For j=Lbound(array,2) to Ubound(array,2)
if j=0 then
if array(i,0)=’ID’ Then
ID=array(i,1)
MsgBox ‘New ID is: ‘ & ID, 64
end if
End If
Next
Next
Теперь работает
Ваш пример не работал, потому что проверка шла каждый раз практически одного и того же значения, поэтому возникало зацикливание и MsgBox возвращала один и тот же результат несколько раз.
Напишите, помог ли Вам мой ответ.
Владимир, добрый день! Я допустил неточность =(, не указал что ID присутствует в одном экземпляре в массиве.
Ваш код работает абсолютно корректно и он вытаскивает все значения для ID!
После парсинга у меня заполнен двумерный массив:
arr(0,0) = ‘ID’ — название поля
arr(1,1)=12344 — значение поля ID ( 12334).
arr(0,1)=‘Version’ название поля
arr(1,2)=2 — значение поля Version (2)
arr(0,3)=‘City’
arr(1,3)=Moscow и т.п.
Цикл должен найти в массиве DatabaseID (0,j) и вывести его значение (1,j) в переменную и после этого цикл должен закончиться.
Владимир, привет!
Ниже вариант который работает:
sFnd = "ID"
For i = 0 To UBound(array, 2)
If sFnd = pAllLegs(0, i) Then
Id = pAllLegs(1, i)
Exit For
End If
Next