• Hallo Leute,


    Ich habe die Array Unique ein wenig erweitert.
    Ich habe vor kurzen in einen Post gelesen das Array Unique erweitert wurde auf die Ausgabe Count,
    dazu hat Oscar ein Funktion Gepostet die sehr schnell ist und wie ich halt bin, versuchte ich alles um in AutoIT alles an Performenc raus zu holen, das ist mein Ergebnis.

    um welchen Post es geht: #Post

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _ArrayUniqueEx
    ; Description ...: Returns Gibt ein eindeutiges 1 oder 2 Dimensonen Array zurück
    ; Syntax.........: _ArrayUniqueEx($aArray,[ $iDimension = 0,[ $iBase = 0,[ $Count = 0,[ $iCase = 0,[ $iOccur = 0,[ $iPost = 0,[ $iFlag = 2,[ $vDelim = '|']]]]]]]])
    ; Parameters ....: $aArray - Das Array bedienen
    ; $$iColumn - [optional] Die Dimension zum verwenden des Array
    ; $iBase - [optional] Ab welchen Index wird gefunden Standart - 0
    ; $Count - [optional] das wieviele auftreten des jeweiligen element 2 dimensionen array rückgabe
    ; $iCase - [optional] Groß-und Kleinschreibung werden berücksichtigt Standart nein - 0
    ; 0 = Groß- und Kleinschreibung werden nicht berücksichtigt (Standardwert).
    ; 1 = Berücksichtigt Groß- und Kleinschreibung.
    ; 2 = Groß- und Kleinschreibung werden nicht berücksichtigt. Es findet ein einfacherer, schnellerer Vergleich statt
    ; $iOccur - [optional] Das wievielte Auftreten des Unterstrings soll gefunden werden. Ist der Wert negativ, wird von rechts ausgehend gesucht. Der Standardwert ist 1 (erstes Auftreten von links ausgehend).
    ; $iPost - [optional] Die Startposition für die Suche.
    ; $iFlag - [optional] ändert wie das Teilen des Strings funktionieren soll. Es können mehrere Flags zusammen verwendet werden, [ Dieses Flag wird nur bei NICHT nutzung von $Count Berücksichtigt ]
    ; 0 = (Standard), es fungiert jedes in den Trennzeichen enthaltene Zeichen als Trennmarkierung
    ; 1 = es wird der gesamte Trennzeichenstring als Trennmarkierung genutzt
    ; 2 = deaktiviert die Rückgabe der Anzahl im ersten Element. Dadurch wird das Array
    ; $vDelim - [optional] Ein oder mehrere Trennzeichen. Die Groß- und Kleinschreibung wird berücksichtigt. [ Standart "|" ]
    ; Return values .: Erfolg - Gibt einen 1-dimensionalen Array mit nur die einzigartigen Elemente dieser Dimension oder ein 2 dimensionen array mit der viezahl des aufgetrehtenen element.
    ; Returns Erfolg 1 oder 2 Dimension Array oder Setzt @error
    ; 0 - Kein error.
    ; -1 - Kein Array oder größer als ein 2 Dimensionen Array
    ; -2 - Übergebener wert von $inCase oder $iFlag ausserhalb der Bestimmung
    ; -3 - Spalte größer oder kleiner als vorhanden
    ; -4 - Kein Fund
    ; Author ........: Kleiner (Autoit.de)
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _ArrayUniqueEx(ByRef $aArray, Const $iColumn = 0, Const $iBase = 0, Const $Count = 0, Const $iCase = 0, Const $iOccur = 0, Const $iPost = 0, Const $iFlag = 2, $vDelim = '|')

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsArray($aArray) Or UBound($aArray, 0) > 2 Then Return SetError(1, 0, -1)
    If ($iFlag < 0 Or $iFlag > 2) Or ($iCase < 0 Or $iCase > 2) Then Return SetError(2, 0, -2)

    [/autoit] [autoit][/autoit] [autoit]

    Local $iUB = UBound($aArray), $iIndex[$iUB], $sTmp, $j = 0
    Local $iStart, $iEnd, $iMid, $iTmp

    [/autoit] [autoit][/autoit] [autoit]

    If Not UBound($aArray, 2) Then
    If $Count Then

    [/autoit] [autoit][/autoit] [autoit]

    For $i = $iBase To $iUB - 1
    $pos = StringInStr($sTmp & $vDelim, $vDelim & $aArray[$i] & $vDelim, $iCase, $iOccur, $iPost)
    Switch Not $pos
    Case True
    $sTmp &= $vDelim & $aArray[$i]
    $iIndex[$j] = (StringLen($sTmp) - StringLen($aArray[$i]))
    $aArray[$j] = 1
    $j += 1
    Case False
    $iTmp = Int($pos / (StringLen($sTmp) / $j))
    If $pos = $iIndex[$iTmp] Then
    $aArray[$iTmp] += 1
    ElseIf $pos = $iIndex[$iTmp + 1] Then
    $aArray[$iTmp + 1] += 1
    Else
    $iStart = 0
    $iEnd = ($j - 1)
    $iMid = Int(($iEnd + $iStart) / 2)
    While $iStart <= $iMid And $pos <> $iIndex[$iMid]
    If $pos < $iIndex[$iMid] Then
    $iEnd = $iMid - 1
    Else
    $iStart = $iMid + 1
    EndIf
    $iMid = Int(($iEnd + $iStart) / 2)
    WEnd
    $aArray[$iMid] += 1
    EndIf
    EndSwitch
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Else

    [/autoit] [autoit][/autoit] [autoit]

    For $i = $iBase To $iUB - 1
    Switch Not StringInStr($sTmp & $vDelim, $vDelim & $aArray[$i] & $vDelim, $iCase, $iOccur, $iPost)
    Case True
    $sTmp &= $vDelim & $aArray[$i]
    EndSwitch
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Else

    [/autoit] [autoit][/autoit] [autoit]

    If ($iColumn > (UBound($aArray, 2) - 1) Or $iColumn < 0) Then Return SetError(3, 0, -3)
    If $Count Then

    [/autoit] [autoit][/autoit] [autoit]

    For $i = $iBase To $iUB - 1
    $pos = StringInStr($sTmp & $vDelim, $vDelim & $aArray[$i][$iColumn] & $vDelim, $iCase, $iOccur, $iPost)
    Switch Not $pos
    Case True
    $sTmp &= $vDelim & $aArray[$i][$iColumn]
    $iIndex[$j] = (StringLen($sTmp) - StringLen($aArray[$i][$iColumn]))
    $aArray[$j][0] = 1
    $j += 1
    Case False
    $iTmp = Int($pos / (StringLen($sTmp) / $j))
    If $pos = $iIndex[$iTmp] Then
    $aArray[$iTmp][0] += 1
    ElseIf $pos = $iIndex[$iTmp + 1] Then
    $aArray[$iTmp + 1][0] += 1
    Else
    $iStart = 0
    $iEnd = ($j - 1)
    $iMid = Int(($iEnd + $iStart) / 2)
    While $iStart <= $iMid And $pos <> $iIndex[$iMid]
    If $pos < $iIndex[$iMid] Then
    $iEnd = $iMid - 1
    Else
    $iStart = $iMid + 1
    EndIf
    $iMid = Int(($iEnd + $iStart) / 2)
    WEnd
    $aArray[$iMid][0] += 1
    EndIf
    EndSwitch
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Else

    [/autoit] [autoit][/autoit] [autoit]

    For $i = $iBase To $iUB - 1
    Switch Not StringInStr($sTmp & $vDelim, $vDelim & $aArray[$i][$iColumn] & $vDelim, $iCase, $iOccur, $iPost)
    Case True
    $sTmp &= $vDelim & $aArray[$i][$iColumn]
    EndSwitch
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If Not $sTmp Then Return SetError(4, 0, -4)

    [/autoit] [autoit][/autoit] [autoit]

    If $Count Then
    If Not UBound($aArray, 2) Then

    [/autoit] [autoit][/autoit] [autoit]

    Local $aTmp[$j][2]
    $j = 0
    For $str In StringSplit(StringTrimLeft($sTmp, StringLen($vDelim)), $vDelim, 2)
    $aTmp[$j][0] = $str
    $aTmp[$j][1] = $aArray[$j]
    $j += 1
    Next
    Return $aTmp

    [/autoit] [autoit][/autoit] [autoit]

    Else

    [/autoit] [autoit][/autoit] [autoit]

    Local $aTmp[$j][2]
    $j = 0
    For $str In StringSplit(StringTrimLeft($sTmp, StringLen($vDelim)), $vDelim, 2)
    $aTmp[$j][0] = $str
    $aTmp[$j][1] = $aArray[$j][0]
    $j += 1
    Next
    Return $aTmp
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Else
    Return StringSplit(StringTrimLeft($sTmp, StringLen($vDelim)), $vDelim, $iFlag)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_ArrayUniqueEx

    [/autoit]

    Lg Kleiner