; #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 .......: ; =============================================================================================================================== 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 = '|') 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) Local $iUB = UBound($aArray), $iIndex[$iUB], $sTmp, $j = 0 Local $iStart, $iEnd, $iMid, $iTmp If Not UBound($aArray, 2) Then If $Count Then 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 Else 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 EndIf Else If ($iColumn > (UBound($aArray, 2) - 1) Or $iColumn < 0) Then Return SetError(3, 0, -3) If $Count Then 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 Else 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 EndIf EndIf If Not $sTmp Then Return SetError(4, 0, -4) If $Count Then If Not UBound($aArray, 2) Then 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 Else 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 Else Return StringSplit(StringTrimLeft($sTmp, StringLen($vDelim)), $vDelim, $iFlag) EndIf EndFunc ;==>_ArrayUniqueEx