Что нового

Как сравнить на идентичность два многомерных массива?

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Функция _ArrayToString с многомерными массивами не работает... Значит сравнение можно произвести только "посимвольно"?
 

amel27

Продвинутый
Сообщения
146
Репутация
55
тогда уж не "посимвольно", а "поэлементно"... _ArrayToString именно это и делает... ;)
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
amel27 [?]
тогда уж не "посимвольно", а "поэлементно"... _ArrayToString именно это и делает...

Не соглашусь с вышесказанным, поскольку _ArrayToString просто создает единую строку из элементов массива - она ни чего не сравнивает. ) И она, как я написал выше, не работает с многомерными массивами. На счет "элементов", спасибо! - ни как не подбиралось нужное слово, что бы выразить мысль. ;))))
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Kalisnik [?]
создает единую строку из элементов массива
Берёт первый элемент, добавляет к нему второй, потом третий - поэлементно.

Правильнее наверное будет поэлементно сравнивать - меньше лишних действий.

Я от нечего делать переписал функцию _ArrayToString для многомерных массивов, если есть желание - используйте.

Код:
Dim $aArray[3][2][5] = [[['2+2', 1, 2, 3, 4], [5, 6, 7, 8, 9]], [[10, 11, 12, 13, 14], [15, 16, 17, 18, 19]], [[20, 21, 22, 23, 24], [25, 26, 27, 28, 29]]]
MsgBox(0, '', _ArrayToStringEx($aArray))

Func _ArrayToStringEx(Const ByRef $avArray, $sDelim = '|')
    If Not IsArray($avArray) Then Return SetError(1, 0, '')

    Local $aSubscripts[1] = [UBound($avArray, 0)]
    ReDim $aSubscripts[$aSubscripts[0]+1]
    Local $aCounters[$aSubscripts[0]+1] = [$aSubscripts[0]]
    Local $sExecute = 'String($avArray'

    For $i = 1 To $aSubscripts[0] Step +1
        $aSubscripts[$i] = UBound($avArray, $i)-1
        $aCounters[$i] = 0
        $sExecute &= '[$aCounters[' & $i & ']]'
    Next

	$sExecute &= ')'

    Local $sResult

    While 1
        $sResult &= Execute($sExecute) & $sDelim
        For $i = $aCounters[0] To 1 Step -1
            If $aCounters[$i] < $aSubscripts[$i] Then
                $aCounters[$i] += 1
                ExitLoop
            ElseIf $i <= 1 Then
                ExitLoop 2
            Else
                $aCounters[$i] = 0
            EndIf
        Next
    WEnd

    Return StringTrimRight($sResult, StringLen($sDelim))
EndFunc
 
Автор
K

Kalisnik

Эволюция
Сообщения
295
Репутация
63
dwerf [?]
Я от нечего делать переписал функцию _ArrayToString для многомерных массивов, если есть желание - используйте.

Спасибо! )) Правда я уже решил затруднительную ситуацию упаковкой многомерного массива в одномерный. :smile: Однако уверен, Ваша работа еще кому-нибудь пригодится, может и я воспользуюсь ей в будущем. :beer:
 
Верх