• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Поиск в массиве

  • Автор темы LIGHT
  • Дата начала
L

LIGHT

Есть 2 поля (многозначных) такой зависимости:

"Иванов"
"Петров"
"Сидоров"

"2"
"5"
"6"

Задача

Найти все документы Петрова и узнать значение в примере 5

Как я вижу, нужно перебирать документы, дальше ебаунтом смотреть сколько элеменов в поле, просматривать какждый элемент, и если совпало брать элемент с таким же номером из второго поля.

Вопрос: еслть ли др. способ поиска в массивах?
 
M

morpheus

<!--QuoteBegin-LIGHT+14:12:2007, 13:45 -->
<span class="vbquote">(LIGHT @ 14:12:2007, 13:45 )</span><!--QuoteEBegin-->ебаунтом
[snapback]89964" rel="nofollow" target="_blank[/snapback]​
[/quote]
раз уж на то пошло то Убаундом ;) :D :D

все документы для петрова можно узнать по поиску db.Search( { my_field *= "Петров" } )
ну а дальше Ubound
 
O

Omh

Вместо ебаунда можно заюзать ArrayGetIndex
Я раньше побаивался этого метода, но последние коды подверждают, что работает достаточно хорошо.
 
M

morpheus

и шо ? таки быстрее работает чм обычный проход по массиву?
 
O

Omh

А фик знает, надо зациклить 100000 раз и проверить.
Могу полагать, что чуток да
Хотя хз...
 
A

amigolinx

ArrayGetIndex
Я раньше побаивался этого метода, но последние коды подверждают, что работает достаточно хорошо.
Хех, поделюсь с сообществом... Сегодня чуть аджна-чакру не сломал из-за этого метода. Создал двумерный массив, запускаю на нем ArrayGetIndex, в ответ получаю результат с какими-то дикими смещениями. Как оказалось, на многомерных массивах ArrayGetIndex возвращает не реальный индекс элемента, а умноженный на размерность массива. Вот оно чё...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
я не понял задачу точно...
но чем не устроит колекция энтрисов + навигатор?
колекцию получаем по ключу а к навигатору приводим (ентрисы) для правильного значения по вьюшке с многозначными полями
 
O

Omh

я не понял задачу точно...
Да там задача 2007 года, думаю уже неактульно

Главная соль тут в этом:
Как оказалось, на многомерных массивах ArrayGetIndex возвращает не реальный индекс элемента, а умноженный на размерность массива. Вот оно чё...
, Михалыч
 
O

Omh

Ну это для тебя капитан очевидность, а lmike видимо не увидел.
Я по капиноочевидческой привычке и разжевал.

Если затупил, парашу паращения, настроение просто отличное, попостить охота!
 
W

wowa

Подыму эту темку с таким вопросом:

ArrayGetIndex - вернет первое вхождение в массив?
т.е.

(0) - фф
(1) - йй
(2) - кк
(3) - йй

т.е. ArrayGetIndex(array, "йй") = 1 или 3 ?
Мне нужно последний. Если все-таки возвращает 1, то как найти последний? перебором?
 
H

hosm

да, ArrayGetIndex(array, "йй") = 1, перебором, и лучше с конца :gigi:
вроде все вопросы =)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
мне не понятен смысл массивов с неуникальным ключём
 
W

wowa

мне не понятен смысл массивов с неуникальным ключём
Есть мульти поле History.

(0) Действие1 # 11-11-2010
(1) Действие2 # 12-11-2010
(2) Действие3 # 12-11-2010
(3) Действие2 # 13-11-2010

Дак вот, "Действие2" может выполняться несколько раз, нужно узнать последнюю дату его выполнения
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
записывать действия в обратном порядке
но ваш вариант - полюбасу преобразовывать в два массива, что автоматически делает выгодным собаковождение
 
N

nnikishi

Уфф, ну и задача конечно, могу предложить слегка ракообразный способ на скрипте

Вкратце: сначала объединяем массив в стринг, ищем справа и режем назад, считаем что получилось

Код:
Function ArrayLastIndex (MyArray) as Long

Dim tempstr As String 
Dim searchstr As String 
Dim newArray	

Dim delim As String 

delim = ";" 'разделитель, можно что угодно, лишь бы оно не находилось в значении поля
searchstr = "my name" 'что искать

tempstr = Join(MyArray, delim) 'объединяем массив в стринг

'проверяем а есть ли это значение вообще

if InStr(tempstr, searchstr)>0 Then

tempstr = Strleftback(tempstr, searchstr)
if tempstr="" Then 'если то что мы ищем является первым значением
ArrayLastIndex = 0
Else

NewArray= Split(tempstr, delim)

ArrayLastIndex = Ubound(NewArray)
End If
Else
'заглушка если этого значения нету вообще
ArrayLastIndex =-1
End If

End Function

Что то аналогичное можно родить и на собаках, думаю даже проще будет
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
Что то аналогичное можно родить и на собаках, думаю даже проще будет
эссесвено
Код:
v:="Действие1 # 11-11-2010":
"Действие2 # 12-11-2010":
"Действие3 # 12-11-2010":
"Действие2 # 13-11-2010";
filtered:=@Trim(@Unique(@Right(@ReplaceSubstring(v;"Действие2 #";{$$});{$$})));
@Subset(filtered;-1);
 
N

nnikishi

ну раз пошла такая малина, то такой вариант:
v:="Действие1 # 11-11-2010":"Действие2 # 12-11-2010":"Действие3 # 12-11-2010":"Действие2 # 13-11-2010";
searchstr:="Действие2 # 13-11-2010";
@If(@Contains(v; searchstr); @Elements(@Explode(@leftback(@Implode(v; ";"); searchstr); ";")); @Return(""))
 
W

wowa

подождите, а чем плох допустим мой варант:

Код:
i = 0 
Forall n In History
If Not ( Instr(n, "Действие2") = 0 ) Then
iIndex = i
End If
i = i + 1
End Forall

в конце кода узнаем индекс... Пока не тестировал, но идея такова.... То что в хистори будет "Действие2" - 100%
 
H

hosm

Проверяется массив сначала, если надо узнать последнее значение...
Код:
iIndex = -1
For i=Ubound(History) to Lbound(History) Step -1
If Instr(History(i), "Действие2") > 0 Then
iIndex = i
Exit For
End If
End For
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!