Что нового

Как перебрать массив данных

ArgoNaft

Новичок
Сообщения
129
Репутация
0
Есть функция в Autoit например как в PHP foreach для полного перебора массива?
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
for next

Осиль справку
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код:
Dim $aTest[4] = [1, 2, 3, 4]

For $aElement In $aTest
	MsgBox(0, 'For..In..Next', $aElement)
Next

For $i = 0 To Ubound($aTest) -1
	MsgBox(0, 'For..To..Next', $aTest[$i])
Next
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703,
Интересно,
Код:
For $aElement In $aTest
;...
работает быстрее, чем
Код:
For $i = 0 To Ubound($aTest) -1
;...
При 1000000 элементов на ~0,1 сек. :scratch:
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
madmasles, тоже заметил, иногда использую его для нахождения чего либо в массиве, по мне так он проще, не нужно узнавать размер массивов с помощью Ubound(), иногда пишу мелкие скрипты на VBS и там в основном такой способ и используется для перебора правда объектов типа:

Код:
For Each Var in objVar.Collections
    WScript.Echo Var.Name
Next
 

asdf8

Скриптер
Сообщения
564
Репутация
152
madmasles [?]
Интересно,
For $aElement In $aTest
работает быстрее, чем
For $i = 0 To Ubound($aTest) -1
При 1000000 элементов на ~0,1 сек.

У меня все наоборот, пустой цикл For To работает раз в 30 быстрее, чем For In (для 1000000 элементов)
Код:
Dim $aTest[1000000]

$begin = TimerInit()
For $aElement In $aTest
Next
ConsoleWrite('->' & TimerDiff($begin) & @CRLF)

$begin = TimerInit()
For $i = 0 To Ubound($aTest) -1
Next
ConsoleWrite('->' & TimerDiff($begin) & @CRLF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
asdf8,
Мой результат.
Код:
Global $a1[1000000], $sT

For $i = 0 To 999999
	$a1[$i] = $i
Next

$iSt = TimerInit()
For $aEl In $a1
	$sT &= $aEl
Next
ConsoleWrite('For ... In: ' & TimerDiff($iSt) & @LF)

$sT = ''
$iSt = TimerInit()
For $i = 0 To 999999
	$sT &= $a1[$i]
Next
ConsoleWrite('For ... To: ' & TimerDiff($iSt) & @LF)
For ... In: 835.351736131652
For ... To: 1021.81358029594
 

asdf8

Скриптер
Сообщения
564
Репутация
152
madmasles

Для корректности, нужно все-таки пустой цикл сравнивать.
Видимо результаты от архитектуры ЦП зависят.
 
Автор
A

ArgoNaft

Новичок
Сообщения
129
Репутация
0
а вот foreach ($arr as $key => $arr_element){}
$key - а как получить номер массива который я в данный момент в переборе обрабатываю?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Может номер элемента в массиве?

Код:
For $i = 0 To Ubound($aTest) -1
    MsgBox(0, '', 'Индекс: ' & $i & @CRLF & 'Значение: ' & $aTest[$i])
Next
 
Автор
A

ArgoNaft

Новичок
Сообщения
129
Репутация
0
ну это как то костыльно, а если идентификатор элемента в массиве будет не цифрой?
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
В одномерном он всегда будет цифрой, впрочем и в любом другом.

Код:
Dim $aTest[3][2] = [['id_1', 1], ['id_2', 2], ['id_3', 3]]

For $i = 0 To Ubound($aTest) -1
	MsgBox(0, '', 'ID: ' & $aTest[$i][0] & @CRLF & 'Value: ' & $aTest[$i][1])
Next
 
Автор
A

ArgoNaft

Новичок
Сообщения
129
Репутация
0
Прошу прощения, ноя думал что в autoit можно ключам задавать любое значение даже строковое, а оказалось нет
$arr = [masha][saha]
$arr = [lena][vany]
....
ну и конечно тогда надобность в foreach отпадает
 
Верх