;------------------------------------------------------------------------------------------------------------ ; Function _ArraySort_2ary(ByRef $ARRAY [, $DIM_1ST=0 [, $DESCENDING=0 [$REVERSE=False]]]) ; ; Description sort an 2D-Array 2-ary ; BaseIndex is 0 ; sort the whole array ; ; Parameter $ARRAY: Array to sort ; optional $DIM_1ST: MainSortIndex; 1st Dim. [0] or last occurence in 2nd Dim.[all other values] (default 0) ; optional $DESCENDING: Sort ascending[0]/descending[1] (default 0) ; optional $REVERSE: Sort 2nd Dimension reverse to 1st Dimension (default False) ; ; Return Succes ByRef 2-ary sorted Array ; Failure 0 set @error ; @error = 1 given array is not array ; @error = 2 given array has only 1 dimension ; ; Requirements By using numeric entry, be sure that type is "number" for correct sort ; Works with any occurences in 2nd Dimension ; ; Author BugFix (bugfix@autoit.de) ;------------------------------------------------------------------------------------------------------------ #include Func _ArraySort_2ary(ByRef $ARRAY, $DIM_1ST=0, $DESCENDING=0, $REVERSE=False) If ( Not IsArray($ARRAY) ) Then SetError(1) Return 0 EndIf Local $FIRST = 0, $LAST, $tmpFIRST, $sortYES = 0 Local $UBound2nd = UBound($ARRAY,2) If @error = 2 Then SetError(2) Return 0 EndIf If $DIM_1ST <> 0 Then $DIM_1ST = $UBound2nd-1 Local $arTmp[1][$UBound2nd] _ArraySort($ARRAY,$DESCENDING,0,0,$UBound2nd,$DIM_1ST) If $REVERSE Then Switch $DESCENDING Case 0 $DESCENDING = 1 Case 1 $DESCENDING = 0 EndSwitch EndIf For $u = 0 To $UBound2nd-1 For $i = 0 To UBound($ARRAY)-1 If $sortYES = 0 Then If $u > 0 Then If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) And _ ( $ARRAY[$i][$u-1] = $ARRAY[$i+1][$u-1] )Then $sortYES = 1 $FIRST = $i EndIf Else If ( $i < UBound($ARRAY)-1 ) And ( $ARRAY[$i][$u] = $ARRAY[$i+1][$u] ) Then $sortYES = 1 $FIRST = $i EndIf EndIf ElseIf $sortYES = 1 Then If ( $i = UBound($ARRAY)-1 ) Or ( $ARRAY[$i][$u] <> $ARRAY[$i+1][$u] ) Then $sortYES = 0 $LAST = $i +1 ReDim $arTmp[$LAST-$FIRST][$UBound2nd] $tmpFIRST = $FIRST For $k = 0 To UBound($arTmp)-1 For $l = 0 To $UBound2nd-1 $arTmp[$k][$l] = $ARRAY[$tmpFIRST][$l] Next $tmpFIRST += 1 Next $tmpFIRST = $FIRST Switch $DIM_1ST Case 0 If $u = $UBound2nd-1 Then _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd,$UBound2nd-1) Else _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd,$u+1) EndIf For $k = 0 To UBound($arTmp)-1 For $l = 1 To $UBound2nd-1 $ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l] Next $tmpFIRST += 1 Next Case $UBound2nd-1 If $u = $UBound2nd-1 Then _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd,0) Else _ArraySort($arTmp,$DESCENDING,0,0,$UBound2nd,$UBound2nd-1-$u-1) EndIf For $k = 0 To UBound($arTmp)-1 For $l = 0 To $UBound2nd-2 $ARRAY[$tmpFIRST][$l] = $arTmp[$k][$l] Next $tmpFIRST += 1 Next EndSwitch EndIf EndIf Next $sortYES = 0 Next EndFunc ;==>_ArraySort_2ary