| 1 | #include-Once
|
|---|
| 2 | ; #INDEX# =======================================================================================================================
|
|---|
| 3 | ; Title .........: Array
|
|---|
| 4 | ; AutoIt Version : 3.2.10++
|
|---|
| 5 | ; Language ......: English
|
|---|
| 6 | ; Description ...: Functions for manipulating arrays.
|
|---|
| 7 | ; Author(s) .....: JdeB, Erik Pilsits, Ultima, Dale (Klaatu) Thompson, Cephas,randallc, Gary Frost, GEOSoft,
|
|---|
| 8 | ; Helias Gerassimou(hgeras), Brian Keene, SolidSnake, gcriaco, LazyCoder, Tylo, David Nuttall,
|
|---|
| 9 | ; Adam Moore (redndahead), SmOke_N, litlmike, Valik
|
|---|
| 10 | ; ===============================================================================================================================
|
|---|
| 11 | ; #NO_DOC_FUNCTION# =============================================================================================================
|
|---|
| 12 | ; Not documented - function(s) no longer needed, will be worked out of the file at a later date
|
|---|
| 13 | ;
|
|---|
| 14 | ;_ArrayCreate
|
|---|
| 15 | ; ===============================================================================================================================
|
|---|
| 16 | ; #CURRENT# =====================================================================================================================
|
|---|
| 17 | ;_ArrayAdd *
|
|---|
| 18 | ;_ArrayBinarySearch *
|
|---|
| 19 | ;_ArrayCombinations
|
|---|
| 20 | ;_ArrayConcatenate *
|
|---|
| 21 | ;_ArrayDelete
|
|---|
| 22 | ;_ArrayDisplay *
|
|---|
| 23 | ;_ArrayFindAll
|
|---|
| 24 | ;_ArrayInsert *
|
|---|
| 25 | ;_ArrayMax *
|
|---|
| 26 | ;_ArrayMaxIndex
|
|---|
| 27 | ;_ArrayMin *
|
|---|
| 28 | ;_ArrayMinIndex
|
|---|
| 29 | ;_ArrayPermute
|
|---|
| 30 | ;_ArrayPop *
|
|---|
| 31 | ;_ArrayPush *
|
|---|
| 32 | ;_ArrayReverse *
|
|---|
| 33 | ;_ArraySearch
|
|---|
| 34 | ;_ArraySort
|
|---|
| 35 | ;_ArraySwap
|
|---|
| 36 | ;_ArrayToClip *
|
|---|
| 37 | ;_ArrayToString *
|
|---|
| 38 | ;_ArrayTrim *
|
|---|
| 39 | ;_ArrayUnique (Corrected the header information)
|
|---|
| 40 | ; * - #MODIFIED FUNCTIONS#
|
|---|
| 41 | ; ===============================================================================================================================
|
|---|
| 42 | ; #NEW FUNCTIONS ADDED# =========================================================================================================
|
|---|
| 43 | ;_ArrayAddColumns
|
|---|
| 44 | ;_ArrayDeleteColumn
|
|---|
| 45 | ;_ArrayMaxIndex2D
|
|---|
| 46 | ;_ArrayMinIndex2D
|
|---|
| 47 | ; ===============================================================================================================================
|
|---|
| 48 | ; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|---|
| 49 | ;__ArrayQuickSort1D
|
|---|
| 50 | ;__ArrayQuickSort2D
|
|---|
| 51 | ;__Array_ExeterInternal
|
|---|
| 52 | ;__Array_Combinations
|
|---|
| 53 | ;__Array_GetNext
|
|---|
| 54 | ; ===============================================================================================================================
|
|---|
| 55 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 56 | ; Name...........: _ArrayAdd
|
|---|
| 57 | ; Description ...: Adds a specified value at the end of an existing array. Also will add a delimited string to a 2D array.
|
|---|
| 58 | ; Syntax.........: _ArrayAdd(ByRef $avArray, $vValue)
|
|---|
| 59 | ; Parameters ....: $avArray - Array to modify
|
|---|
| 60 | ; $vValue - Value to add
|
|---|
| 61 | ; Return values .: Success - Index of last added item
|
|---|
| 62 | ; Failure - -1, sets @error
|
|---|
| 63 | ; |1 - $avArray is not an array
|
|---|
| 64 | ; |2 - $avArray is not a 1 or 2 dimensional array
|
|---|
| 65 | ; |3 - $vValue has too many subitems
|
|---|
| 66 | ; Author ........: Jos van der Zande <jdeb at autoitscript dot com>
|
|---|
| 67 | ; Modified.......: Ultima - code cleanup, BrewManNH - 2D array support
|
|---|
| 68 | ; Remarks .......:
|
|---|
| 69 | ; Related .......: _ArrayConcatenate, _ArrayDelete, _ArrayInsert, _ArrayPop, _ArrayPush
|
|---|
| 70 | ; Link ..........:
|
|---|
| 71 | ; Example .......: Yes
|
|---|
| 72 | ; ===============================================================================================================================
|
|---|
| 73 | Func _ArrayAdd(ByRef $avArray, $vValue, $sSeparator = "|")
|
|---|
| 74 | If Not IsArray($avArray) Then Return SetError(1, 0, -1)
|
|---|
| 75 | If UBound($avArray, 0) > 2 Then Return SetError(2, 0, -1)
|
|---|
| 76 | Local $avValue = StringSplit($vValue, $sSeparator)
|
|---|
| 77 | If Not @error Then
|
|---|
| 78 | ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $avValue = ' & $avValue & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
|
|---|
| 79 | $iSubMax = $avValue[0]
|
|---|
| 80 | If $iSubMax <> UBound($avArray, 2) Then Return SetError(3, 0, 0)
|
|---|
| 81 | EndIf
|
|---|
| 82 | If UBound($avArray, 0) = 1 Then
|
|---|
| 83 | Local $iUBound = UBound($avArray)
|
|---|
| 84 | ReDim $avArray[$iUBound + 1]
|
|---|
| 85 | $avArray[$iUBound] = $vValue
|
|---|
| 86 | Return $iUBound
|
|---|
| 87 | Else
|
|---|
| 88 | Local $iUBound = UBound($avArray)
|
|---|
| 89 | ReDim $avArray[$iUBound + 1][$iSubMax]
|
|---|
| 90 | For $i = 0 To $iSubMax - 1
|
|---|
| 91 | $avArray[$iUBound][$i] = $avValue[$i + 1]
|
|---|
| 92 | Next
|
|---|
| 93 | Return $iUBound
|
|---|
| 94 | EndIf
|
|---|
| 95 | EndFunc ;==>_ArrayAdd
|
|---|
| 96 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 97 | ; Name...........: _ArrayAddColumns
|
|---|
| 98 | ; Description ...: Adds a specified number of columns to an array.
|
|---|
| 99 | ; Syntax.........: _ArrayAddColumns(ByRef $aArrayIn, $NumColCount)
|
|---|
| 100 | ; Parameters ....: $aArrayIn - Array to modify
|
|---|
| 101 | ; $NumColCount - Number of columns to add (default = 1)
|
|---|
| 102 | ; Return values .: Success - New array with columns added
|
|---|
| 103 | ; Failure - -1, sets @error
|
|---|
| 104 | ; |1 - $aArrayIn is not an array
|
|---|
| 105 | ; |2 - $NumColCount is an invalid number
|
|---|
| 106 | ; |3 - Array has too many dimensions (2D array max)
|
|---|
| 107 | ; Author ........: Malkey
|
|---|
| 108 | ; Remarks .......: This will add any number of columns to a 1D or 2D array of any size and preserves
|
|---|
| 109 | ; the contents of the array being modified
|
|---|
| 110 | ; Related .......: _ArrayConcatenate2D, _ArrayDelete, _ArrayInsert, _ArrayPop2D, _ArrayPush
|
|---|
| 111 | ; Link ..........:
|
|---|
| 112 | ; Example .......: Yes
|
|---|
| 113 | ; ===============================================================================================================================
|
|---|
| 114 | Func _ArrayAddColumns(ByRef $aArr, $iNumColToAdd = 1)
|
|---|
| 115 | If IsArray($aArr) = 0 Then Return SetError(1, 0, -1) ; Filter out non-array
|
|---|
| 116 | If $iNumColToAdd < 1 Then Return SetError(2, 0, -1) ; $iNumColToAdd must be greater than zero to add a column.
|
|---|
| 117 | If UBound($aArr, 0) > 2 Then Return SetError(3, 0, -1) ; Only allows a 1d or 2d array past this line.
|
|---|
| 118 | If UBound($aArr, 0) = 1 Then ; ====== For 1d array ========
|
|---|
| 119 | Local $aRet[UBound($aArr)][$iNumColToAdd + 1] ; Create new 2d array.
|
|---|
| 120 | For $R = 0 To UBound($aArr) - 1
|
|---|
| 121 | $aRet[$R][0] = $aArr[$R]
|
|---|
| 122 | Next
|
|---|
| 123 | Else ; ======= For 2d array ============
|
|---|
| 124 | Local $aRet = $aArr ; So that ByRef $aArr is not altered outside of function.
|
|---|
| 125 | ReDim $aRet[UBound($aRet)][UBound($aRet, 2) + $iNumColToAdd] ; ReDim 2d array only.
|
|---|
| 126 | EndIf
|
|---|
| 127 | Return $aRet
|
|---|
| 128 | EndFunc ;==>_ArrayAddColumns
|
|---|
| 129 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 130 | ; Name...........: _ArrayBinarySearch
|
|---|
| 131 | ; Description ...: Uses the binary search algorithm to search through a 1 or 2-dimensional array.
|
|---|
| 132 | ; Syntax.........: _ArrayBinarySearch(Const ByRef $avArray, $vValue[, $iSubItem = 0[, $iStart = 0[, $iEnd = 0]]])
|
|---|
| 133 | ; Parameters ....: $avArray - Array to search
|
|---|
| 134 | ; $vValue - Value to find
|
|---|
| 135 | ; $iSubItem - [optional] Which column to search on [Default = First (0) column]
|
|---|
| 136 | ; $iStart - [optional] Index of array to start searching at [Default = start of array]
|
|---|
| 137 | ; $iEnd - [optional] Index of array to stop searching at [Default = end of array]
|
|---|
| 138 | ; Return values .: Success - Index that value was found at
|
|---|
| 139 | ; Failure - -1, sets @error to:
|
|---|
| 140 | ; |1 - $avArray is not an array
|
|---|
| 141 | ; |2 - $vValue outside of array's min/max values
|
|---|
| 142 | ; |3 - $vValue was not found in array
|
|---|
| 143 | ; |4 - $iStart is greater than $iEnd
|
|---|
| 144 | ; |5 - $iSubItem is greater than actual number of columns
|
|---|
| 145 | ; |6 - $avArray has too many dimensions
|
|---|
| 146 | ; Author ........: Jos van der Zande <jdeb at autoitscript dot com>
|
|---|
| 147 | ; Modified.......: Ultima - added $iEnd as parameter, code cleanup
|
|---|
| 148 | ; Modified.......: BrewManNH - added ability to search a 2D array
|
|---|
| 149 | ; Remarks .......: When performing a binary search on an array of items, the contents of the column being searched MUST be
|
|---|
| 150 | ; sorted before the search is done, otherwise undefined results will be returned.
|
|---|
| 151 | ; Related .......: _ArrayFindAll, _ArraySearch, _ArrayBinarySearch
|
|---|
| 152 | ; Link ..........:
|
|---|
| 153 | ; Example .......: Yes
|
|---|
| 154 | ; ===============================================================================================================================
|
|---|
| 155 | Func _ArrayBinarySearch(Const ByRef $avArray, $vValue, $iSubItem = 0, $iStart = 0, $iEnd = 0)
|
|---|
| 156 | If UBound($avArray, 0) > 2 Then Return SetError(6, 0, -1)
|
|---|
| 157 | Local $Is2D = False
|
|---|
| 158 | If UBound($avArray, 0) > 1 Then
|
|---|
| 159 | $Is2D = True
|
|---|
| 160 | EndIf
|
|---|
| 161 | If UBound($avArray, 2) < $iSubItem Then Return SetError(5, 0, -1)
|
|---|
| 162 | If Not IsArray($avArray) Then Return SetError(1, 0, -1)
|
|---|
| 163 | Local $iUBound = UBound($avArray) - 1
|
|---|
| 164 | ; Bounds checking
|
|---|
| 165 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
|
|---|
| 166 | If $iStart < 0 Then $iStart = 0
|
|---|
| 167 | If $iStart > $iEnd Then Return SetError(4, 0, -1)
|
|---|
| 168 | Local $iMid = Int(($iEnd + $iStart) / 2)
|
|---|
| 169 | If Not $Is2D Then
|
|---|
| 170 | If $avArray[$iStart] > $vValue Or $avArray[$iEnd] < $vValue Then Return SetError(2, 0, -1)
|
|---|
| 171 | ; Search
|
|---|
| 172 | While $iStart <= $iMid And $vValue <> $avArray[$iMid]
|
|---|
| 173 | If $vValue < $avArray[$iMid] Then
|
|---|
| 174 | $iEnd = $iMid - 1
|
|---|
| 175 | Else
|
|---|
| 176 | $iStart = $iMid + 1
|
|---|
| 177 | EndIf
|
|---|
| 178 | $iMid = Int(($iEnd + $iStart) / 2)
|
|---|
| 179 | WEnd
|
|---|
| 180 | If $iStart > $iEnd Then Return SetError(3, 0, -1) ; Entry not found
|
|---|
| 181 | Return $iMid
|
|---|
| 182 | Else
|
|---|
| 183 | If $avArray[$iStart][$iSubItem] > $vValue Or $avArray[$iEnd][$iSubItem] < $vValue Then Return SetError(2, 0, -1)
|
|---|
| 184 | ; Search
|
|---|
| 185 | While $iStart <= $iMid And $vValue <> $avArray[$iMid][$iSubItem]
|
|---|
| 186 | If $vValue < $avArray[$iMid][$iSubItem] Then
|
|---|
| 187 | $iEnd = $iMid - 1
|
|---|
| 188 | Else
|
|---|
| 189 | $iStart = $iMid + 1
|
|---|
| 190 | EndIf
|
|---|
| 191 | $iMid = Int(($iEnd + $iStart) / 2)
|
|---|
| 192 | WEnd
|
|---|
| 193 | If $iStart > $iEnd Then Return SetError(3, 0, -1) ; Entry not found
|
|---|
| 194 | Return $iMid
|
|---|
| 195 | EndIf
|
|---|
| 196 | EndFunc ;==>_ArrayBinarySearch
|
|---|
| 197 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 198 | ; Name...........: _ArrayCombinations
|
|---|
| 199 | ; Description ...: Returns an Array of the Combinations of a Set of Elements from a Selected Array
|
|---|
| 200 | ; Syntax.........: _ArrayCombinations(ByRef $avArray, $iSet[, $sDelim = ""])
|
|---|
| 201 | ; Parameters ....: $avArray - The Array to use
|
|---|
| 202 | ; $iSet - Size of the combinations set
|
|---|
| 203 | ; $sDelim - [optional] String result separator, default is "" for none
|
|---|
| 204 | ; Return values .: Success - Returns an Array of Combinations
|
|---|
| 205 | ; |Returns an array, the first element ($array[0]) contains the number of strings returned.
|
|---|
| 206 | ; |The remaining elements ($array[1], $array[2], etc.) contain the Combinations.
|
|---|
| 207 | ; Failure - Returns 0 and Sets @error:
|
|---|
| 208 | ; |1 - The Input Must be an Array
|
|---|
| 209 | ; |2 - $avArray is not a 1 dimensional array
|
|---|
| 210 | ; Author ........: Erik Pilsits
|
|---|
| 211 | ; Modified.......: 07/08/2008
|
|---|
| 212 | ; Remarks .......: The input array must be 0-based, i.e. no counter in $array[0]. Based on an algorithm by Kenneth H. Rosen.
|
|---|
| 213 | ;+
|
|---|
| 214 | ; http://www.merriampark.com/comb.htm
|
|---|
| 215 | ; Related .......: _ArrayPermute
|
|---|
| 216 | ; Link ..........:
|
|---|
| 217 | ; Example .......: Yes
|
|---|
| 218 | ; ==========================================================================================
|
|---|
| 219 | Func _ArrayCombinations(ByRef $avArray, $iSet, $sDelim = "")
|
|---|
| 220 | If Not IsArray($avArray) Then Return SetError(1, 0, 0)
|
|---|
| 221 | If UBound($avArray, 0) <> 1 Then Return SetError(2, 0, 0)
|
|---|
| 222 | Local $iN = UBound($avArray)
|
|---|
| 223 | Local $iR = $iSet
|
|---|
| 224 | Local $aIdx[$iR]
|
|---|
| 225 | For $i = 0 To $iR - 1
|
|---|
| 226 | $aIdx[$i] = $i
|
|---|
| 227 | Next
|
|---|
| 228 | Local $iTotal = __Array_Combinations($iN, $iR)
|
|---|
| 229 | Local $iLeft = $iTotal
|
|---|
| 230 | Local $aResult[$iTotal + 1]
|
|---|
| 231 | $aResult[0] = $iTotal
|
|---|
| 232 | Local $iCount = 1
|
|---|
| 233 | While $iLeft > 0
|
|---|
| 234 | __Array_GetNext($iN, $iR, $iLeft, $iTotal, $aIdx)
|
|---|
| 235 | For $i = 0 To $iSet - 1
|
|---|
| 236 | $aResult[$iCount] &= $avArray[$aIdx[$i]] & $sDelim
|
|---|
| 237 | Next
|
|---|
| 238 | If $sDelim <> "" Then $aResult[$iCount] = StringTrimRight($aResult[$iCount], 1)
|
|---|
| 239 | $iCount += 1
|
|---|
| 240 | WEnd
|
|---|
| 241 | Return $aResult
|
|---|
| 242 | EndFunc ;==>_ArrayCombinations
|
|---|
| 243 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 244 | ; Name...........: _ArrayConcatenate
|
|---|
| 245 | ; Description ...: Concatenate two arrays.
|
|---|
| 246 | ; Syntax.........: _ArrayConcatenate(ByRef $avArrayTarget, Const ByRef $avArraySource, $iStart = 0)
|
|---|
| 247 | ; Parameters ....: $avArrayTarget - The array to concatenate onto
|
|---|
| 248 | ; $avArraySource - The array to concatenate from
|
|---|
| 249 | ; $iStart - index of the first Source Array entry
|
|---|
| 250 | ; Return values .: Success - $avArrayTarget's new size
|
|---|
| 251 | ; Failure - 0, sets @error to:
|
|---|
| 252 | ; |1 - $avArrayTarget is not an array
|
|---|
| 253 | ; |2 - $avArraySource is not an array
|
|---|
| 254 | ; |3 - $avArrayTarget is not a 1 or 2 dimensional array
|
|---|
| 255 | ; |4 - $avArraySource is not a 1 or 2 dimensional array
|
|---|
| 256 | ; |5 - $avArrayTarget and $avArraySource is not a 1 or 2 dimensional array
|
|---|
| 257 | ; |6 - Arrays have different number of subitems
|
|---|
| 258 | ; |7 - Arrays have different number of dimensions
|
|---|
| 259 | ; Author ........: Ultima
|
|---|
| 260 | ; Modified.......: Partypooper - added target start index
|
|---|
| 261 | ; Remarks .......:
|
|---|
| 262 | ; Related .......: _ArrayAdd, _ArrayPush
|
|---|
| 263 | ; Link ..........:
|
|---|
| 264 | ; Example .......: Yes
|
|---|
| 265 | ; ===============================================================================================================================
|
|---|
| 266 | Func _ArrayConcatenate(ByRef $avArrayTarget, Const ByRef $avArraySource, $iStart = 0)
|
|---|
| 267 | If Not IsArray($avArrayTarget) Then Return SetError(1, 0, 0)
|
|---|
| 268 | If Not IsArray($avArraySource) Then Return SetError(2, 0, 0)
|
|---|
| 269 | If UBound($avArraySource, 0) <> UBound($avArrayTarget, 0) Then Return SetError(7, 0, 0)
|
|---|
| 270 | If UBound($avArrayTarget, 0) > 2 Then
|
|---|
| 271 | If UBound($avArraySource, 0) > 2 Then Return SetError(5, 0, 0)
|
|---|
| 272 | Return SetError(3, 0, 0)
|
|---|
| 273 | EndIf
|
|---|
| 274 | If UBound($avArraySource, 0) > 2 Then Return SetError(4, 0, 0)
|
|---|
| 275 | If UBound($avArrayTarget, 2) <> UBound($avArraySource, 2) Then Return SetError(6, 0, 0)
|
|---|
| 276 | If UBound($avArraySource, 0) = 1 Then
|
|---|
| 277 | Local $iUBoundTarget = UBound($avArrayTarget) - $iStart, $iUBoundSource = UBound($avArraySource)
|
|---|
| 278 | ReDim $avArrayTarget[$iUBoundTarget + $iUBoundSource]
|
|---|
| 279 | For $i = $iStart To $iUBoundSource - 1
|
|---|
| 280 | $avArrayTarget[$iUBoundTarget + $i] = $avArraySource[$i]
|
|---|
| 281 | Next
|
|---|
| 282 | Return $iUBoundTarget + $iUBoundSource
|
|---|
| 283 | Else
|
|---|
| 284 | Local $iUBoundTarget = UBound($avArrayTarget) - $iStart, $iUBoundSource = UBound($avArraySource), $iSubItems = UBound($avArrayTarget, 2)
|
|---|
| 285 | ReDim $avArrayTarget[$iUBoundTarget + $iUBoundSource][$iSubItems]
|
|---|
| 286 | For $i = $iStart To $iUBoundSource - 1
|
|---|
| 287 | For $x = 0 To $iSubItems - 1
|
|---|
| 288 | $avArrayTarget[$iUBoundTarget + $i][$x] = $avArraySource[$i][$x]
|
|---|
| 289 | Next
|
|---|
| 290 | Next
|
|---|
| 291 | Return $iUBoundTarget + $iUBoundSource
|
|---|
| 292 | EndIf
|
|---|
| 293 | EndFunc ;==>_ArrayConcatenate
|
|---|
| 294 | ; #NO_DOC_FUNCTION# =============================================================================================================
|
|---|
| 295 | ; Name...........: _ArrayCreate
|
|---|
| 296 | ; Description ...: Create a small array and quickly assign values.
|
|---|
| 297 | ; Syntax.........: _ArrayCreate ($v_0 [,$v_1 [,... [, $v_20 ]]])
|
|---|
| 298 | ; Parameters ....: $v_0 - The first element of the array
|
|---|
| 299 | ; $v_1 - [optional] The second element of the array
|
|---|
| 300 | ; ...
|
|---|
| 301 | ; $v_20 - [optional] The twenty-first element of the array
|
|---|
| 302 | ; Return values .: Success - The array with values
|
|---|
| 303 | ; Author ........: Dale (Klaatu) Thompson, Jos van der Zande <jdeb at autoitscript dot com> - rewritten to avoid Eval() errors in Obsufcator
|
|---|
| 304 | ; Modified.......: Ultima
|
|---|
| 305 | ; Remarks .......: Arrays of up to 21 elements in size can be created with this function.
|
|---|
| 306 | ; Related .......:
|
|---|
| 307 | ; Link ..........:
|
|---|
| 308 | ; Example .......: Yes
|
|---|
| 309 | ; ===============================================================================================================================
|
|---|
| 310 | Func _ArrayCreate($v_0, $v_1 = 0, $v_2 = 0, $v_3 = 0, $v_4 = 0, $v_5 = 0, $v_6 = 0, $v_7 = 0, $v_8 = 0, $v_9 = 0, $v_10 = 0, $v_11 = 0, $v_12 = 0, $v_13 = 0, $v_14 = 0, $v_15 = 0, $v_16 = 0, $v_17 = 0, $v_18 = 0, $v_19 = 0, $v_20 = 0)
|
|---|
| 311 | Local $av_Array[21] = [$v_0, $v_1, $v_2, $v_3, $v_4, $v_5, $v_6, $v_7, $v_8, $v_9, $v_10, $v_11, $v_12, $v_13, $v_14, $v_15, $v_16, $v_17, $v_18, $v_19, $v_20]
|
|---|
| 312 | ReDim $av_Array[@NumParams]
|
|---|
| 313 | Return $av_Array
|
|---|
| 314 | EndFunc ;==>_ArrayCreate
|
|---|
| 315 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 316 | ; Name...........: _ArrayDelete
|
|---|
| 317 | ; Description ...: Deletes the specified element from the given array.
|
|---|
| 318 | ; Syntax.........: _ArrayDelete(ByRef $avArray, $iElement)
|
|---|
| 319 | ; Parameters ....: $avArray - Array to modify
|
|---|
| 320 | ; $iElement - Element to delete
|
|---|
| 321 | ; Return values .: Success - New size of the array
|
|---|
| 322 | ; Failure - 0, sets @error to:
|
|---|
| 323 | ; |1 - $avArray is not an array
|
|---|
| 324 | ; |3 - $avArray has too many dimensions (only up to 2D supported)
|
|---|
| 325 | ; |(2 - Deprecated error code)
|
|---|
| 326 | ; Author ........: Cephas <cephas at clergy dot net>
|
|---|
| 327 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - array passed ByRef, Ultima - 2D arrays supported, reworked function (no longer needs temporary array; faster when deleting from end)
|
|---|
| 328 | ; Remarks .......: If the array has one element left (or one row for 2D arrays), it will be set to "" after _ArrayDelete() is used on it.
|
|---|
| 329 | ;+
|
|---|
| 330 | ; If the $ilement is greater than the array size then the last element is destroyed.
|
|---|
| 331 | ; Related .......: _ArrayAdd, _ArrayInsert, _ArrayPop, _ArrayPush
|
|---|
| 332 | ; Link ..........:
|
|---|
| 333 | ; Example .......: Yes
|
|---|
| 334 | ; ===============================================================================================================================
|
|---|
| 335 | Func _ArrayDelete(ByRef $avArray, $iElement)
|
|---|
| 336 | If Not IsArray($avArray) Then Return SetError(1, 0, 0)
|
|---|
| 337 | Local $iUBound = UBound($avArray, 1) - 1
|
|---|
| 338 | If Not $iUBound Then
|
|---|
| 339 | $avArray = ""
|
|---|
| 340 | Return 0
|
|---|
| 341 | EndIf
|
|---|
| 342 | ; Bounds checking
|
|---|
| 343 | If $iElement < 0 Then $iElement = 0
|
|---|
| 344 | If $iElement > $iUBound Then $iElement = $iUBound
|
|---|
| 345 | ; Move items after $iElement up by 1
|
|---|
| 346 | Switch UBound($avArray, 0)
|
|---|
| 347 | Case 1
|
|---|
| 348 | For $i = $iElement To $iUBound - 1
|
|---|
| 349 | $avArray[$i] = $avArray[$i + 1]
|
|---|
| 350 | Next
|
|---|
| 351 | ReDim $avArray[$iUBound]
|
|---|
| 352 | Case 2
|
|---|
| 353 | Local $iSubMax = UBound($avArray, 2) - 1
|
|---|
| 354 | For $i = $iElement To $iUBound - 1
|
|---|
| 355 | For $j = 0 To $iSubMax
|
|---|
| 356 | $avArray[$i][$j] = $avArray[$i + 1][$j]
|
|---|
| 357 | Next
|
|---|
| 358 | Next
|
|---|
| 359 | ReDim $avArray[$iUBound][$iSubMax + 1]
|
|---|
| 360 | Case Else
|
|---|
| 361 | Return SetError(3, 0, 0)
|
|---|
| 362 | EndSwitch
|
|---|
| 363 | Return $iUBound
|
|---|
| 364 | EndFunc ;==>_ArrayDelete
|
|---|
| 365 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 366 | ; Name...........: _ArrayDeleteColumn
|
|---|
| 367 | ; Description ...: Deletes a specified column from a 2D array.
|
|---|
| 368 | ; Syntax.........: _ArrayDeleteColumn(ByRef $aArrayIn, $iSubItem)
|
|---|
| 369 | ; Parameters ....: $aArrayIn - Array to modify
|
|---|
| 370 | ; $iSubItem - The column to delete
|
|---|
| 371 | ; Return values .: Success - New array with column deleted
|
|---|
| 372 | ; Failure - -1, sets @error
|
|---|
| 373 | ; |1 - $aArrayIn is not an array
|
|---|
| 374 | ; |2 - Array is not a 2D array
|
|---|
| 375 | ; |3 - $iSubItem is an invalid number
|
|---|
| 376 | ; Author ........: PsaltyDS
|
|---|
| 377 | ; Remarks .......: This will delete a column from a 2D array of any size and preserves the contents of the
|
|---|
| 378 | ; array being modified
|
|---|
| 379 | ; Notes .........: This will NOT create a 1D array from a 2D array even if your final array contains only 1 column
|
|---|
| 380 | ; this is because the final array will be dimensioned as a 2D array with the second subitem dimensioned
|
|---|
| 381 | ; to zero.
|
|---|
| 382 | ; Related .......: _ArrayConcatenate2D, _ArrayDelete, _ArrayInsert, _ArrayPop2D, _ArrayPush, _ArrayAddColumn
|
|---|
| 383 | ; Link ..........:
|
|---|
| 384 | ; Example .......: No
|
|---|
| 385 | ; ===============================================================================================================================
|
|---|
| 386 | Func _ArrayDeleteColumn(ByRef $aArrayIn, $iSubItem)
|
|---|
| 387 | If Not IsArray($aArrayIn) Then Return SetError(1, 0, -1); Not an array
|
|---|
| 388 | If UBound($aArrayIn, 0) <> 2 Then Return SetError(2, 0, -1); Not a 2D array
|
|---|
| 389 | If ($iSubItem < 0) Or ($iSubItem > (UBound($aArrayIn, 2) - 1)) Then Return SetError(3, 0, -1); $iSubItem out of range
|
|---|
| 390 | If $iSubItem < UBound($aArrayIn, 2) - 1 Then
|
|---|
| 391 | For $c = $iSubItem To UBound($aArrayIn, 2) - 2
|
|---|
| 392 | For $R = 0 To UBound($aArrayIn) - 1
|
|---|
| 393 | $aArrayIn[$R][$c] = $aArrayIn[$R][$c + 1]
|
|---|
| 394 | Next
|
|---|
| 395 | Next
|
|---|
| 396 | EndIf
|
|---|
| 397 | ReDim $aArrayIn[UBound($aArrayIn)][UBound($aArrayIn, 2) - 1]
|
|---|
| 398 | Return 1
|
|---|
| 399 | EndFunc ;==>_ArrayDeleteColumn
|
|---|
| 400 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 401 | ; Name...........: _ArrayDisplay
|
|---|
| 402 | ; Description ...: Displays given 1D or 2D array array in a listview.
|
|---|
| 403 | ; Syntax.........: _ArrayDisplay(Const ByRef $avArray[, $sTitle = "Array: ListView Display"[, $iItemLimit = -1[, $iTranspose = 0[, $sSeparator = ""[, $sReplace = "|"[, $sHeader = ""]]]]]])
|
|---|
| 404 | ; Parameters ....: $avArray - Array to display
|
|---|
| 405 | ; $sTitle - [optional] Title to use for window
|
|---|
| 406 | ; $iItemLimit - [optional] Maximum number of listview items (rows) to show
|
|---|
| 407 | ; $iTranspose - [optional] If set differently than default, will transpose the array if 2D
|
|---|
| 408 | ; $sSeparator - [optional] Change Opt("GUIDataSeparatorChar") on-the-fly
|
|---|
| 409 | ; $sReplace - [optional] String to replace any occurrence of $sSeparator with in each array element
|
|---|
| 410 | ; $sheader - [optional] Header column names
|
|---|
| 411 | ; Return values .: Success - 1
|
|---|
| 412 | ; Failure - 0, sets @error:
|
|---|
| 413 | ; |1 - $avArray is not an array
|
|---|
| 414 | ; |2 - $avArray has too many dimensions (only up to 2D supported)
|
|---|
| 415 | ; Author ........: randallc, Ultima
|
|---|
| 416 | ; Modified.......: Gary Frost (gafrost), Ultima, Zedna, jpm, BrewManNH
|
|---|
| 417 | ; Remarks .......: This will now autosize the GUI Window and autosize the column widths to match the longest items
|
|---|
| 418 | ; Related .......:
|
|---|
| 419 | ; Link ..........:
|
|---|
| 420 | ; Example .......: Yes
|
|---|
| 421 | ; ===============================================================================================================================
|
|---|
| 422 | Func _ArrayDisplay(Const ByRef $avArray, $sTitle = "Array: ListView Display", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "")
|
|---|
| 423 | If Not IsArray($avArray) Then Return SetError(1, 0, 0)
|
|---|
| 424 | ; Dimension checking
|
|---|
| 425 | Local $iDimension = UBound($avArray, 0), $iUBound = UBound($avArray, 1) - 1, $iSubMax = UBound($avArray, 2) - 1
|
|---|
| 426 | If $iDimension > 2 Then Return SetError(2, 0, 0)
|
|---|
| 427 | ; Separator handling
|
|---|
| 428 | ;~ If $sSeparator = "" Then $sSeparator = Chr(1)
|
|---|
| 429 | If $sSeparator = "" Then $sSeparator = Chr(124)
|
|---|
| 430 | ; Check the separator to make sure it's not used literally in the array
|
|---|
| 431 | If _ArraySearch($avArray, $sSeparator, 0, 0, 0, 1) <> -1 Then
|
|---|
| 432 | For $x = 1 To 255
|
|---|
| 433 | If $x >= 32 And $x <= 127 Then ContinueLoop
|
|---|
| 434 | Local $sFind = _ArraySearch($avArray, Chr($x), 0, 0, 0, 1)
|
|---|
| 435 | If $sFind = -1 Then
|
|---|
| 436 | $sSeparator = Chr($x)
|
|---|
| 437 | ExitLoop
|
|---|
| 438 | EndIf
|
|---|
| 439 | Next
|
|---|
| 440 | EndIf
|
|---|
| 441 | ; Declare variables
|
|---|
| 442 | Local $vTmp, $iBuffer = 64
|
|---|
| 443 | Local $iColLimit = 250
|
|---|
| 444 | Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator)
|
|---|
| 445 | ; Swap dimensions if transposing
|
|---|
| 446 | If $iSubMax < 0 Then $iSubMax = 0
|
|---|
| 447 | If $iTranspose Then
|
|---|
| 448 | $vTmp = $iUBound
|
|---|
| 449 | $iUBound = $iSubMax
|
|---|
| 450 | $iSubMax = $vTmp
|
|---|
| 451 | EndIf
|
|---|
| 452 | ; Set limits for dimensions
|
|---|
| 453 | If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
|
|---|
| 454 | If $iItemLimit < 1 Then $iItemLimit = $iUBound
|
|---|
| 455 | If $iUBound > $iItemLimit Then $iUBound = $iItemLimit
|
|---|
| 456 | ; Set header up
|
|---|
| 457 | If $sHeader = "" Then
|
|---|
| 458 | $sHeader = "Row " ; blanks added to adjust column size for big number of rows
|
|---|
| 459 | For $i = 0 To $iSubMax
|
|---|
| 460 | $sHeader &= $sSeparator & "Col " & $i
|
|---|
| 461 | Next
|
|---|
| 462 | EndIf
|
|---|
| 463 | ; Convert array into text for listview
|
|---|
| 464 | Local $avArrayText[$iUBound + 1]
|
|---|
| 465 | For $i = 0 To $iUBound
|
|---|
| 466 | $avArrayText[$i] = "[" & $i & "]"
|
|---|
| 467 | For $j = 0 To $iSubMax
|
|---|
| 468 | ; Get current item
|
|---|
| 469 | If $iDimension = 1 Then
|
|---|
| 470 | If $iTranspose Then
|
|---|
| 471 | $vTmp = $avArray[$j]
|
|---|
| 472 | Else
|
|---|
| 473 | $vTmp = $avArray[$i]
|
|---|
| 474 | EndIf
|
|---|
| 475 | Else
|
|---|
| 476 | If $iTranspose Then
|
|---|
| 477 | $vTmp = $avArray[$j][$i]
|
|---|
| 478 | Else
|
|---|
| 479 | $vTmp = $avArray[$i][$j]
|
|---|
| 480 | EndIf
|
|---|
| 481 | EndIf
|
|---|
| 482 | ; Add to text array
|
|---|
| 483 | $vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1)
|
|---|
| 484 | $avArrayText[$i] &= $sSeparator & $vTmp
|
|---|
| 485 | ; Set max buffer size
|
|---|
| 486 | $vTmp = StringLen($vTmp)
|
|---|
| 487 | If $vTmp > $iBuffer Then $iBuffer = $vTmp
|
|---|
| 488 | Next
|
|---|
| 489 | Next
|
|---|
| 490 | $iBuffer += 1
|
|---|
| 491 | ; GUI Constants
|
|---|
| 492 | Local Const $_ARRAYCONSTANT_GUI_DOCKBORDERS = 0x66
|
|---|
| 493 | Local Const $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 0x40
|
|---|
| 494 | Local Const $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 0x0200
|
|---|
| 495 | Local Const $_ARRAYCONSTANT_GUI_DOCKLEFT = 0x2
|
|---|
| 496 | Local Const $_ARRAYCONSTANT_GUI_DOCKRIGHT = 0x4
|
|---|
| 497 | Local Const $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3
|
|---|
| 498 | Local Const $_ARRAYCONSTANT_LVIF_PARAM = 0x4
|
|---|
| 499 | Local Const $_ARRAYCONSTANT_LVIF_TEXT = 0x1
|
|---|
| 500 | Local Const $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH = (0x1000 + 29)
|
|---|
| 501 | Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4)
|
|---|
| 502 | Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44)
|
|---|
| 503 | Local Const $_ARRAYCONSTANT_LVM_INSERTITEMW = (0x1000 + 77)
|
|---|
| 504 | Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
|
|---|
| 505 | Local Const $_ARRAYCONSTANT_LVM_SETITEMW = (0x1000 + 76)
|
|---|
| 506 | Local Const $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 0x20
|
|---|
| 507 | Local Const $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 0x1
|
|---|
| 508 | Local Const $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 0x8
|
|---|
| 509 | Local Const $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 0x0200
|
|---|
| 510 | Local Const $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 0x00010000
|
|---|
| 511 | Local Const $_ARRAYCONSTANT_WS_MINIMIZEBOX = 0x00020000
|
|---|
| 512 | Local Const $_ARRAYCONSTANT_WS_SIZEBOX = 0x00040000
|
|---|
| 513 | Local Const $_ARRAYCONSTANT_tagLVITEM = "int Mask;int Item;int SubItem;int State;int StateMask;ptr Text;int TextMax;int Image;int Param;int Indent;int GroupID;int Columns;ptr pColumns"
|
|---|
| 514 | Local $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM)
|
|---|
| 515 | Local $tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]"), $pBuffer = DllStructGetPtr($tBuffer)
|
|---|
| 516 | Local $tItem = DllStructCreate($_ARRAYCONSTANT_tagLVITEM), $pItem = DllStructGetPtr($tItem)
|
|---|
| 517 | DllStructSetData($tItem, "Param", 0)
|
|---|
| 518 | DllStructSetData($tItem, "Text", $pBuffer)
|
|---|
| 519 | DllStructSetData($tItem, "TextMax", $iBuffer)
|
|---|
| 520 | ; Set interface up
|
|---|
| 521 | Local $iWidth = 640, $iHeight = 480
|
|---|
| 522 | Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
|
|---|
| 523 | Local $aiGUISize = WinGetClientSize($hGUI)
|
|---|
| 524 | Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
|
|---|
| 525 | Local $hCopy = GUICtrlCreateButton("Copy Selected", 3, $aiGUISize[1] - 23, $aiGUISize[0] - 6, 20)
|
|---|
| 526 | GUICtrlSetResizing($hListView, $_ARRAYCONSTANT_GUI_DOCKBORDERS)
|
|---|
| 527 | GUICtrlSetResizing($hCopy, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
|
|---|
| 528 | GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES)
|
|---|
| 529 | GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT)
|
|---|
| 530 | GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE)
|
|---|
| 531 | ; Fill listview
|
|---|
| 532 | Local $aItem
|
|---|
| 533 | For $i = 0 To $iUBound
|
|---|
| 534 | If GUICtrlCreateListViewItem($avArrayText[$i], $hListView) = 0 Then
|
|---|
| 535 | ; use GUICtrlSendMsg() to overcome AutoIt limitation
|
|---|
| 536 | $aItem = StringSplit($avArrayText[$i], $sSeparator)
|
|---|
| 537 | DllStructSetData($tBuffer, "Text", $aItem[1])
|
|---|
| 538 | ; Add listview item
|
|---|
| 539 | DllStructSetData($tItem, "Item", $i)
|
|---|
| 540 | DllStructSetData($tItem, "SubItem", 0)
|
|---|
| 541 | DllStructSetData($tItem, "Mask", $iAddMask)
|
|---|
| 542 | GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMW, 0, $pItem)
|
|---|
| 543 | ; Set listview subitem text
|
|---|
| 544 | DllStructSetData($tItem, "Mask", $_ARRAYCONSTANT_LVIF_TEXT)
|
|---|
| 545 | For $j = 2 To $aItem[0]
|
|---|
| 546 | DllStructSetData($tBuffer, "Text", $aItem[$j])
|
|---|
| 547 | DllStructSetData($tItem, "SubItem", $j - 1)
|
|---|
| 548 | GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETITEMW, 0, $pItem)
|
|---|
| 549 | Next
|
|---|
| 550 | EndIf
|
|---|
| 551 | Next
|
|---|
| 552 | ;~ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< added lines in this section
|
|---|
| 553 | ;~
|
|---|
| 554 | ; adjust column size to match longest item in the list
|
|---|
| 555 | GUICtrlSendMsg($hListView, 4126, 1, -1)
|
|---|
| 556 | If $iDimension = 2 Then
|
|---|
| 557 | For $i = 2 To UBound($avArray, 2)
|
|---|
| 558 | GUICtrlSendMsg($hListView, 4126, $i, -1)
|
|---|
| 559 | Next
|
|---|
| 560 | EndIf
|
|---|
| 561 | ;~ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< added lines in this section
|
|---|
| 562 | ;~
|
|---|
| 563 | ; adjust window width
|
|---|
| 564 | $iWidth = 0
|
|---|
| 565 | For $i = 0 To $iSubMax + 1
|
|---|
| 566 | $iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
|
|---|
| 567 | Next
|
|---|
| 568 | If $iWidth < 250 Then $iWidth = 230
|
|---|
| 569 | $iWidth += 40 ;~ <<<<<<<<<<<<<<<<<<<<<< Changed this value from 20 to 40
|
|---|
| 570 | If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100
|
|---|
| 571 | WinMove($hGUI, "", (@DesktopWidth - $iWidth) / 2, Default, $iWidth)
|
|---|
| 572 | ; Show dialog
|
|---|
| 573 | GUISetState(@SW_SHOW, $hGUI)
|
|---|
| 574 | While 1
|
|---|
| 575 | Switch GUIGetMsg()
|
|---|
| 576 | Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
|
|---|
| 577 | ExitLoop
|
|---|
| 578 | Case $hCopy
|
|---|
| 579 | Local $sClip = ""
|
|---|
| 580 | ; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
|
|---|
| 581 | Local $aiCurItems[1] = [0]
|
|---|
| 582 | For $i = 0 To GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0)
|
|---|
| 583 | If GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then
|
|---|
| 584 | $aiCurItems[0] += 1
|
|---|
| 585 | ReDim $aiCurItems[$aiCurItems[0] + 1]
|
|---|
| 586 | $aiCurItems[$aiCurItems[0]] = $i
|
|---|
| 587 | EndIf
|
|---|
| 588 | Next
|
|---|
| 589 | ; Generate clipboard text
|
|---|
| 590 | If Not $aiCurItems[0] Then
|
|---|
| 591 | For $sItem In $avArrayText
|
|---|
| 592 | $sClip &= $sItem & @CRLF
|
|---|
| 593 | Next
|
|---|
| 594 | Else
|
|---|
| 595 | For $i = 1 To UBound($aiCurItems) - 1
|
|---|
| 596 | $sClip &= $avArrayText[$aiCurItems[$i]] & @CRLF
|
|---|
| 597 | Next
|
|---|
| 598 | EndIf
|
|---|
| 599 | ClipPut($sClip)
|
|---|
| 600 | EndSwitch
|
|---|
| 601 | WEnd
|
|---|
| 602 | GUIDelete($hGUI)
|
|---|
| 603 | Opt("GUIOnEventMode", $iOnEventMode)
|
|---|
| 604 | Opt("GUIDataSeparatorChar", $sDataSeparatorChar)
|
|---|
| 605 | Return 1
|
|---|
| 606 | EndFunc ;==>_ArrayDisplay
|
|---|
| 607 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 608 | ; Name...........: _ArrayFindAll
|
|---|
| 609 | ; Description ...: Find the indices of all ocurrences of a search query between two points in a 1D or 2D array using _ArraySearch().
|
|---|
| 610 | ; Syntax.........: _ArrayFindAll(Const ByRef $avArray, $vValue[, $iStart = 0[, $iEnd = 0[, $iCase = 0[, $iPartial = 0[, $iSubItem = 0]]]]])
|
|---|
| 611 | ; Parameters ....: $avArray - The array to search
|
|---|
| 612 | ; $vValue - What to search $avArray for
|
|---|
| 613 | ; $iStart - [optional] Index of array to start searching at
|
|---|
| 614 | ; $iEnd - [optional] Index of array to stop searching at
|
|---|
| 615 | ; $iCase - [optional] If set to 1, search is case sensitive
|
|---|
| 616 | ; $iPartial - [optional] If set to 1, executes a partial search
|
|---|
| 617 | ; $iSubItem - [optional] Sub-index to search on in 2D arrays
|
|---|
| 618 | ; Return values .: Success - An array of all index numbers in array containing $vValue
|
|---|
| 619 | ; Failure - -1, sets @error (see _ArraySearch() description for error codes)
|
|---|
| 620 | ; Author ........: GEOSoft, Ultima
|
|---|
| 621 | ; Modified.......:
|
|---|
| 622 | ; Remarks .......:
|
|---|
| 623 | ; Related .......: _ArrayBinarySearch, _ArraySearch
|
|---|
| 624 | ; Link ..........:
|
|---|
| 625 | ; Example .......: Yes
|
|---|
| 626 | ; ===============================================================================================================================
|
|---|
| 627 | Func _ArrayFindAll(Const ByRef $avArray, $vValue, $iStart = 0, $iEnd = 0, $iCase = 0, $iPartial = 0, $iSubItem = 0)
|
|---|
| 628 | $iStart = _ArraySearch($avArray, $vValue, $iStart, $iEnd, $iCase, $iPartial, 1, $iSubItem)
|
|---|
| 629 | If @error Then Return SetError(@error, 0, -1)
|
|---|
| 630 | Local $iIndex = 0, $avResult[UBound($avArray)]
|
|---|
| 631 | Do
|
|---|
| 632 | $avResult[$iIndex] = $iStart
|
|---|
| 633 | $iIndex += 1
|
|---|
| 634 | $iStart = _ArraySearch($avArray, $vValue, $iStart + 1, $iEnd, $iCase, $iPartial, 1, $iSubItem)
|
|---|
| 635 | Until @error
|
|---|
| 636 | ReDim $avResult[$iIndex]
|
|---|
| 637 | Return $avResult
|
|---|
| 638 | EndFunc ;==>_ArrayFindAll
|
|---|
| 639 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 640 | ; Name...........: _ArrayInsert
|
|---|
| 641 | ; Description ...: Add a new value at the specified position.
|
|---|
| 642 | ; Syntax.........: _ArrayInsert(ByRef $avArray, $iElement[, $vValue = ""[, $sDelim = "|"]])
|
|---|
| 643 | ; Parameters ....: $avArray - Array to modify
|
|---|
| 644 | ; $iElement - Position to insert item at:
|
|---|
| 645 | ; If $iElement <= 0 then item will be inserted at the start of the array
|
|---|
| 646 | ; If $iElement > than the size of the array, the item will be added to the end of the array.
|
|---|
| 647 | ; $vValue - [optional] Value of item to insert
|
|---|
| 648 | ; $sDelim - [optional] Delimiter character to split incoming string on, default is | character
|
|---|
| 649 | ; Return values .: Success - New size of the array
|
|---|
| 650 | ; Failure - 0, sets @error
|
|---|
| 651 | ; |1 - $avArray is not an array
|
|---|
| 652 | ; |2 - $avArray is not a 1 or 2 dimensional array
|
|---|
| 653 | ; |3 - $vValue has different number of subitems than $avArray, when using a 2D array.
|
|---|
| 654 | ; Author ........: Jos van der Zande <jdeb at autoitscript dot com>
|
|---|
| 655 | ; Modified.......: Ultima - code cleanup
|
|---|
| 656 | ; Modified.......: BrewManNH - Added 2D array support
|
|---|
| 657 | ; Remarks .......:
|
|---|
| 658 | ; Related .......: _ArrayAdd, _ArrayDelete, _ArrayPop, _ArrayPush
|
|---|
| 659 | ; Link ..........:
|
|---|
| 660 | ; Example .......: Yes
|
|---|
| 661 | ; ===============================================================================================================================
|
|---|
| 662 | Func _ArrayInsert(ByRef $avArray, $iElement, $vValue = "", $sDelim = "|")
|
|---|
| 663 | If Not IsArray($avArray) Then Return SetError(1, 0, 0)
|
|---|
| 664 | If UBound($avArray, 0) > 2 Then Return SetError(2, 0, 0)
|
|---|
| 665 | If $iElement > UBound($avArray) Then $iElement = UBound($avArray)
|
|---|
| 666 | If $iElement < 0 Then $iElement = 0
|
|---|
| 667 | ; Add 1 to the array
|
|---|
| 668 | Local $iUBound = UBound($avArray) + 1, $iMaxSubItems = UBound($avArray, 2), $iDimension = UBound($avArray, 0)
|
|---|
| 669 | If $iDimension = 1 Then
|
|---|
| 670 | ReDim $avArray[$iUBound]
|
|---|
| 671 | ; Move all entries over til the specified element
|
|---|
| 672 | For $i = $iUBound - 1 To $iElement + 1 Step -1
|
|---|
| 673 | $avArray[$i] = $avArray[$i - 1]
|
|---|
| 674 | Next
|
|---|
| 675 | ; Add the value in the specified element
|
|---|
| 676 | $avArray[$iElement] = $vValue
|
|---|
| 677 | Return $iUBound
|
|---|
| 678 | Else
|
|---|
| 679 | ReDim $avArray[$iUBound][$iMaxSubItems]
|
|---|
| 680 | Local $avValue = StringSplit($vValue, $sDelim, 2)
|
|---|
| 681 | If UBound($avValue) <> $iMaxSubItems Then Return SetError(3, 0, 0)
|
|---|
| 682 | For $i = $iUBound - 1 To $iElement + 1 Step -1
|
|---|
| 683 | For $j = 0 To $iMaxSubItems - 1
|
|---|
| 684 | $avArray[$i][$j] = $avArray[$i - 1][$j]
|
|---|
| 685 | Next
|
|---|
| 686 | Next
|
|---|
| 687 | ; Add the value in the specified element
|
|---|
| 688 | For $j = 0 To $iMaxSubItems - 1
|
|---|
| 689 | $avArray[$iElement][$j] = $avValue[$j]
|
|---|
| 690 | Next
|
|---|
| 691 | Return $iUBound
|
|---|
| 692 | EndIf
|
|---|
| 693 | EndFunc ;==>_ArrayInsert
|
|---|
| 694 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 695 | ; Name...........: _ArrayMax
|
|---|
| 696 | ; Description ...: Returns the highest value held in an array.
|
|---|
| 697 | ; Syntax.........: _ArrayMax(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]])
|
|---|
| 698 | ; Parameters ....: $avArray - Array to search
|
|---|
| 699 | ; $iCompNumeric - [optional] Comparison method:
|
|---|
| 700 | ; |0 - compare alphanumerically
|
|---|
| 701 | ; |1 - compare numerically
|
|---|
| 702 | ; $iStart - [optional] Index of array to start searching at
|
|---|
| 703 | ; $iEnd - [optional] Index of array to stop searching at
|
|---|
| 704 | ; $iSubItem - [optional] Subitem to search (first subitem is 0)
|
|---|
| 705 | ; Return values .: Success - The maximum value in the array
|
|---|
| 706 | ; Failure - "", sets @error (see _ArrayMaxIndex() description for error codes)
|
|---|
| 707 | ; Author ........: Cephas <cephas at clergy dot net>
|
|---|
| 708 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup
|
|---|
| 709 | ; Modified.......: BrewManNH - Added 2D array support
|
|---|
| 710 | ; Remarks .......:
|
|---|
| 711 | ; Related .......: _ArrayMaxIndex, _ArrayMin, _ArrayMinIndex, _ArrayUnique
|
|---|
| 712 | ; Link ..........:
|
|---|
| 713 | ; Example .......: Yes
|
|---|
| 714 | ; ===============================================================================================================================
|
|---|
| 715 | Func _ArrayMax(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0)
|
|---|
| 716 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1
|
|---|
| 717 | If $iSubItem < 1 Then $iSubItem = 0
|
|---|
| 718 | If UBound($avArray, 0) = 1 Then
|
|---|
| 719 | Local $iResult = _ArrayMaxIndex($avArray, $iCompNumeric, $iStart, $iEnd)
|
|---|
| 720 | If @error Then Return SetError(@error, 0, "")
|
|---|
| 721 | Return $avArray[$iResult]
|
|---|
| 722 | Else
|
|---|
| 723 | Local $iResult = _ArrayMaxIndex2D($avArray, $iCompNumeric, $iStart, $iEnd, $iSubItem)
|
|---|
| 724 | If @error Then Return SetError(@error, 0, "")
|
|---|
| 725 | Return $avArray[$iResult][$iSubItem]
|
|---|
| 726 | EndIf
|
|---|
| 727 | EndFunc ;==>_ArrayMax
|
|---|
| 728 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 729 | ; Name...........: _ArrayMaxIndex
|
|---|
| 730 | ; Description ...: Returns the index where the highest value occurs in the array.
|
|---|
| 731 | ; Syntax.........: _ArrayMaxIndex(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0]]])
|
|---|
| 732 | ; Parameters ....: $avArray - Array to search
|
|---|
| 733 | ; $iCompNumeric - [optional] Comparison method:
|
|---|
| 734 | ; |0 - compare alphanumerically
|
|---|
| 735 | ; |1 - compare numerically
|
|---|
| 736 | ; $iStart - [optional] Index of array to start searching at
|
|---|
| 737 | ; $iEnd - [optional] Index of array to stop searching at
|
|---|
| 738 | ; Return values .: Success - The index of the maximum value in the array
|
|---|
| 739 | ; Failure - -1, sets @error to:
|
|---|
| 740 | ; |1 - $avArray is not an array
|
|---|
| 741 | ; |2 - $iStart is greater than $iEnd
|
|---|
| 742 | ; |3 - $avArray is not a 1 dimensional array
|
|---|
| 743 | ; Author ........: Cephas <cephas at clergy dot net>
|
|---|
| 744 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup, optimization
|
|---|
| 745 | ; Remarks .......:
|
|---|
| 746 | ; Related .......: _ArrayMax, _ArrayMin, _ArrayMinIndex
|
|---|
| 747 | ; Link ..........:
|
|---|
| 748 | ; Example .......: Yes
|
|---|
| 749 | ; ===============================================================================================================================
|
|---|
| 750 | Func _ArrayMaxIndex(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0)
|
|---|
| 751 | If Not IsArray($avArray) Or UBound($avArray, 0) <> 1 Then Return SetError(1, 0, -1)
|
|---|
| 752 | If UBound($avArray, 0) <> 1 Then Return SetError(3, 0, -1)
|
|---|
| 753 | Local $iUBound = UBound($avArray) - 1
|
|---|
| 754 | ; Bounds checking
|
|---|
| 755 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
|
|---|
| 756 | If $iStart < 0 Then $iStart = 0
|
|---|
| 757 | If $iStart > $iEnd Then Return SetError(2, 0, -1)
|
|---|
| 758 | Local $iMaxIndex = $iStart
|
|---|
| 759 | ; Search
|
|---|
| 760 | If $iCompNumeric Then
|
|---|
| 761 | For $i = $iStart To $iEnd
|
|---|
| 762 | If Number($avArray[$iMaxIndex]) < Number($avArray[$i]) Then $iMaxIndex = $i
|
|---|
| 763 | Next
|
|---|
| 764 | Else
|
|---|
| 765 | For $i = $iStart To $iEnd
|
|---|
| 766 | If $avArray[$iMaxIndex] < $avArray[$i] Then $iMaxIndex = $i
|
|---|
| 767 | Next
|
|---|
| 768 | EndIf
|
|---|
| 769 | Return $iMaxIndex
|
|---|
| 770 | EndFunc ;==>_ArrayMaxIndex
|
|---|
| 771 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 772 | ; Name...........: _ArrayMaxIndex2D
|
|---|
| 773 | ; Description ...: Returns the index where the highest value occurs in the array.
|
|---|
| 774 | ; Syntax.........: _ArrayMax2DIndex(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = ]]]])
|
|---|
| 775 | ; Parameters ....: $avArray - Array to search
|
|---|
| 776 | ; $iCompNumeric - [optional] Comparison method:
|
|---|
| 777 | ; |0 - compare alphanumerically
|
|---|
| 778 | ; |1 - compare numerically
|
|---|
| 779 | ; $iStart - [optional] Index of array to start searching at
|
|---|
| 780 | ; $iEnd - [optional] Index of array to stop searching at
|
|---|
| 781 | ; $iSubItem - [optional] Subitem to search
|
|---|
| 782 | ; Return values .: Success - The index of the maximum value in the array
|
|---|
| 783 | ; Failure - -1, sets @error to:
|
|---|
| 784 | ; |1 - $avArray is not an array
|
|---|
| 785 | ; |2 - $iStart is greater than $iEnd
|
|---|
| 786 | ; |3 - $avArray is not a 2 dimensional array
|
|---|
| 787 | ; Author ........: Cephas <cephas at clergy dot net>
|
|---|
| 788 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup, optimization
|
|---|
| 789 | ; Modified.......: BrewManNH - Added 2D array support
|
|---|
| 790 | ; Remarks .......: This a modified version of _ArrayMaxIndex which adds support for 2D arrays.
|
|---|
| 791 | ; Related .......: _ArrayMax, _ArrayMin, _ArrayMaxIndex
|
|---|
| 792 | ; Link ..........:
|
|---|
| 793 | ; Example .......: Yes
|
|---|
| 794 | ; ===============================================================================================================================
|
|---|
| 795 | Func _ArrayMaxIndex2D(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0)
|
|---|
| 796 | If Not IsArray($avArray) Or UBound($avArray, 0) <> 2 Then Return SetError(1, 0, -1)
|
|---|
| 797 | If UBound($avArray, 0) <> 2 Then Return SetError(3, 0, -1)
|
|---|
| 798 | Local $iUBound = UBound($avArray) - 1
|
|---|
| 799 | ; Bounds checking
|
|---|
| 800 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
|
|---|
| 801 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1
|
|---|
| 802 | If $iSubItem < 1 Then $iSubItem = 0
|
|---|
| 803 | If $iStart < 0 Then $iStart = 0
|
|---|
| 804 | If $iStart > $iEnd Then Return SetError(2, 0, -1)
|
|---|
| 805 | Local $iMaxIndex = $iStart
|
|---|
| 806 | ; Search
|
|---|
| 807 | If $iCompNumeric Then
|
|---|
| 808 | For $i = $iStart To $iEnd
|
|---|
| 809 | If Number($avArray[$iMaxIndex][$iSubItem]) < Number($avArray[$i][$iSubItem]) Then $iMaxIndex = $i
|
|---|
| 810 | Next
|
|---|
| 811 | Else
|
|---|
| 812 | For $i = $iStart To $iEnd
|
|---|
| 813 | If $avArray[$iMaxIndex][$iSubItem] < $avArray[$i][$iSubItem] Then $iMaxIndex = $i
|
|---|
| 814 | Next
|
|---|
| 815 | EndIf
|
|---|
| 816 | Return $iMaxIndex
|
|---|
| 817 | EndFunc ;==>_ArrayMaxIndex2D
|
|---|
| 818 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 819 | ; Name...........: _ArrayMin
|
|---|
| 820 | ; Description ...: Returns the lowest value held in an array.
|
|---|
| 821 | ; Syntax.........: _ArrayMin(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]])
|
|---|
| 822 | ; Parameters ....: $avArray - Array to search
|
|---|
| 823 | ; $iCompNumeric - [optional] Comparison method:
|
|---|
| 824 | ; |0 - compare alphanumerically
|
|---|
| 825 | ; |1 - compare numerically
|
|---|
| 826 | ; $iStart - [optional] Index of array to start searching at
|
|---|
| 827 | ; $iEnd - [optional] Index of array to stop searching at
|
|---|
| 828 | ; $iSubItem - [optional] Subitem to search
|
|---|
| 829 | ; Return values .: Success - The minimum value in the array
|
|---|
| 830 | ; Failure - "", sets @error (see _ArrayMinIndex2D() description for error codes)
|
|---|
| 831 | ; Author ........: Cephas <cephas at clergy dot net>
|
|---|
| 832 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup
|
|---|
| 833 | ; Modified.......: BrewManNH - Added 2D array support
|
|---|
| 834 | ; Remarks .......:
|
|---|
| 835 | ; Related .......: _ArrayMax2D, _ArrayMax2DIndex, _ArrayMinIndex2D, _ArrayUnique
|
|---|
| 836 | ; Link ..........:
|
|---|
| 837 | ; Example .......: Yes
|
|---|
| 838 | ; ===============================================================================================================================
|
|---|
| 839 | Func _ArrayMin(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0)
|
|---|
| 840 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1
|
|---|
| 841 | If $iSubItem < 1 Then $iSubItem = 0
|
|---|
| 842 | If UBound($avArray, 0) = 1 Then
|
|---|
| 843 | Local $iResult = _ArrayMinIndex($avArray, $iCompNumeric, $iStart, $iEnd)
|
|---|
| 844 | If @error Then Return SetError(@error, 0, "")
|
|---|
| 845 | Return $avArray[$iResult]
|
|---|
| 846 | Else
|
|---|
| 847 | Local $iResult = _ArrayMinIndex2D($avArray, $iCompNumeric, $iStart, $iEnd, $iSubItem)
|
|---|
| 848 | If @error Then Return SetError(@error, 0, "")
|
|---|
| 849 | Return $avArray[$iResult][$iSubItem]
|
|---|
| 850 | EndIf
|
|---|
| 851 | EndFunc ;==>_ArrayMin
|
|---|
| 852 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 853 | ; Name...........: _ArrayMinIndex
|
|---|
| 854 | ; Description ...: Returns the index where the lowest value occurs in the array.
|
|---|
| 855 | ; Syntax.........: _ArrayMinIndex(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0]]])
|
|---|
| 856 | ; Parameters ....: $avArray - Array to search
|
|---|
| 857 | ; $iCompNumeric - [optional] Comparison method:
|
|---|
| 858 | ; |0 - compare alphanumerically
|
|---|
| 859 | ; |1 - compare numerically
|
|---|
| 860 | ; $iStart - [optional] Index of array to start searching at
|
|---|
| 861 | ; $iEnd - [optional] Index of array to stop searching at
|
|---|
| 862 | ; Return values .: Success - The index of the minimum value in the array
|
|---|
| 863 | ; Failure - -1, sets @error to:
|
|---|
| 864 | ; |1 - $avArray is not an array
|
|---|
| 865 | ; |2 - $iStart is greater than $iEnd
|
|---|
| 866 | ; |3 - $avArray is not a 1 dimensional array
|
|---|
| 867 | ; Author ........: Cephas <cephas at clergy dot net>
|
|---|
| 868 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup, optimization
|
|---|
| 869 | ; Remarks .......:
|
|---|
| 870 | ; Related .......: _ArrayMax, _ArrayMaxIndex, _ArrayMin
|
|---|
| 871 | ; Link ..........:
|
|---|
| 872 | ; Example .......: Yes
|
|---|
| 873 | ; ===============================================================================================================================
|
|---|
| 874 | Func _ArrayMinIndex(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0)
|
|---|
| 875 | If Not IsArray($avArray) Then Return SetError(1, 0, -1)
|
|---|
| 876 | If UBound($avArray, 0) <> 1 Then Return SetError(3, 0, -1)
|
|---|
| 877 | Local $iUBound = UBound($avArray) - 1
|
|---|
| 878 | ; Bounds checking
|
|---|
| 879 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
|
|---|
| 880 | If $iStart < 0 Then $iStart = 0
|
|---|
| 881 | If $iStart > $iEnd Then Return SetError(2, 0, -1)
|
|---|
| 882 | Local $iMinIndex = $iStart
|
|---|
| 883 | ; Search
|
|---|
| 884 | If $iCompNumeric Then
|
|---|
| 885 | For $i = $iStart To $iEnd
|
|---|
| 886 | If Number($avArray[$iMinIndex]) > Number($avArray[$i]) Then $iMinIndex = $i
|
|---|
| 887 | Next
|
|---|
| 888 | Else
|
|---|
| 889 | For $i = $iStart To $iEnd
|
|---|
| 890 | If $avArray[$iMinIndex] > $avArray[$i] Then $iMinIndex = $i
|
|---|
| 891 | Next
|
|---|
| 892 | EndIf
|
|---|
| 893 | Return $iMinIndex
|
|---|
| 894 | EndFunc ;==>_ArrayMinIndex
|
|---|
| 895 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 896 | ; Name...........: _ArrayMinIndex2D
|
|---|
| 897 | ; Description ...: Returns the index where the lowest value occurs in the array.
|
|---|
| 898 | ; Syntax.........: _ArrayMinIndex2D(Const ByRef $avArray[, $iCompNumeric = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]])
|
|---|
| 899 | ; Parameters ....: $avArray - Array to search
|
|---|
| 900 | ; $iCompNumeric - [optional] Comparison method:
|
|---|
| 901 | ; |0 - compare alphanumerically
|
|---|
| 902 | ; |1 - compare numerically
|
|---|
| 903 | ; $iStart - [optional] Index of array to start searching at
|
|---|
| 904 | ; $iEnd - [optional] Index of array to stop searching at
|
|---|
| 905 | ; $iSubItem - [optional] Subitem to search
|
|---|
| 906 | ; Return values .: Success - The index of the minimum value in the array
|
|---|
| 907 | ; Failure - -1, sets @error to:
|
|---|
| 908 | ; |1 - $avArray is not an array
|
|---|
| 909 | ; |2 - $iStart is greater than $iEnd
|
|---|
| 910 | ; |3 - $avArray is not a 2 dimensional array
|
|---|
| 911 | ; Author ........: Cephas <cephas at clergy dot net>
|
|---|
| 912 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - Added $iCompNumeric and $iStart parameters and logic, Ultima - added $iEnd parameter, code cleanup, optimization
|
|---|
| 913 | ; Modified.......: BrewManNH - Added 2D array support
|
|---|
| 914 | ; Remarks .......: This a modified version of _ArrayMinIndex which adds support for 2D arrays.
|
|---|
| 915 | ; Related .......: _ArrayMax2D, _ArrayMaxIndex, _ArrayMin2D
|
|---|
| 916 | ; Link ..........:
|
|---|
| 917 | ; Example .......: Yes
|
|---|
| 918 | ; ===============================================================================================================================
|
|---|
| 919 | Func _ArrayMinIndex2D(Const ByRef $avArray, $iCompNumeric = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0)
|
|---|
| 920 | If Not IsArray($avArray) Then Return SetError(1, 0, -1)
|
|---|
| 921 | If UBound($avArray, 0) <> 2 Then Return SetError(3, 0, -1)
|
|---|
| 922 | Local $iUBound = UBound($avArray) - 1
|
|---|
| 923 | ; Bounds checking
|
|---|
| 924 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
|
|---|
| 925 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1
|
|---|
| 926 | If $iSubItem < 1 Then $iSubItem = 0
|
|---|
| 927 | If $iStart < 0 Then $iStart = 0
|
|---|
| 928 | If $iStart > $iEnd Then Return SetError(2, 0, -1)
|
|---|
| 929 | Local $iMinIndex = $iStart
|
|---|
| 930 | ; Search
|
|---|
| 931 | If $iCompNumeric Then
|
|---|
| 932 | For $i = $iStart To $iEnd
|
|---|
| 933 | If Number($avArray[$iMinIndex][$iSubItem]) > Number($avArray[$i][$iSubItem]) Then $iMinIndex = $i
|
|---|
| 934 | Next
|
|---|
| 935 | Else
|
|---|
| 936 | For $i = $iStart To $iEnd
|
|---|
| 937 | If $avArray[$iMinIndex][$iSubItem] > $avArray[$i][$iSubItem] Then $iMinIndex = $i
|
|---|
| 938 | Next
|
|---|
| 939 | EndIf
|
|---|
| 940 | Return $iMinIndex
|
|---|
| 941 | EndFunc ;==>_ArrayMinIndex2D
|
|---|
| 942 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 943 | ; Name...........: _ArrayPermute
|
|---|
| 944 | ; Description ...: Returns an Array of the Permutations of all Elements in an Array
|
|---|
| 945 | ; Syntax.........: _ArrayPermute(ByRef $avArray[, $sDelim = ""])
|
|---|
| 946 | ; Parameters ....: $avArray - The Array to get Permutations
|
|---|
| 947 | ; $sDelim - [optional] String result separator, default is "" for none
|
|---|
| 948 | ; Return values .: Success - Returns an Array of Permutations
|
|---|
| 949 | ; |$array[0] contains the number of strings returned.
|
|---|
| 950 | ; |The remaining elements ($array[1], $array[2] ... $array[n]) contain the Permutations.
|
|---|
| 951 | ; |Failure - Returns 0 and Sets @error:
|
|---|
| 952 | ; |1 - The Input Must be an Array
|
|---|
| 953 | ; |2 - $avArray is not a 1 dimensional array
|
|---|
| 954 | ; Author ........: Erik Pilsits
|
|---|
| 955 | ; Modified.......: 07/08/2008
|
|---|
| 956 | ; Remarks .......: The input array must be 0-based, i.e. no counter in $array[0]. Based on the algorithm by Alexander Bogomolny.
|
|---|
| 957 | ;+
|
|---|
| 958 | ; http://www.bearcave.com/random_hacks/permute.html
|
|---|
| 959 | ; Related .......: _ArrayCombinations
|
|---|
| 960 | ; Link ..........:
|
|---|
| 961 | ; Example .......: Yes
|
|---|
| 962 | ; ===============================================================================================================================
|
|---|
| 963 | Func _ArrayPermute(ByRef $avArray, $sDelim = "")
|
|---|
| 964 | If Not IsArray($avArray) Then Return SetError(1, 0, 0)
|
|---|
| 965 | If UBound($avArray, 0) <> 1 Then Return SetError(2, 0, 0)
|
|---|
| 966 | Local $iSize = UBound($avArray), $iFactorial = 1, $aIdx[$iSize], $aResult[1], $iCount = 1
|
|---|
| 967 | For $i = 0 To $iSize - 1
|
|---|
| 968 | $aIdx[$i] = $i
|
|---|
| 969 | Next
|
|---|
| 970 | For $i = $iSize To 1 Step -1
|
|---|
| 971 | $iFactorial *= $i
|
|---|
| 972 | Next
|
|---|
| 973 | ReDim $aResult[$iFactorial + 1]
|
|---|
| 974 | $aResult[0] = $iFactorial
|
|---|
| 975 | __Array_ExeterInternal($avArray, 0, $iSize, $sDelim, $aIdx, $aResult, $iCount)
|
|---|
| 976 | Return $aResult
|
|---|
| 977 | EndFunc ;==>_ArrayPermute
|
|---|
| 978 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 979 | ; Name...........: _ArrayPop
|
|---|
| 980 | ; Description ...: Returns the last element of an array, deleting that element from the array at the same time.
|
|---|
| 981 | ; Syntax.........: _ArrayPop(ByRef $avArray[, $cDelim = "|"])
|
|---|
| 982 | ; Parameters ....: $avArray - Array to modify
|
|---|
| 983 | ; $cDelim - [optional] For 2D arrays, the delimiter to insert between elements in the returned string.
|
|---|
| 984 | ; Return values .: Success - The last element of the array, or for 2D arrays, the last "row" of the array in a delimited string
|
|---|
| 985 | ; Failure - "", sets @error
|
|---|
| 986 | ; |1 - The Input Must be an Array
|
|---|
| 987 | ; |2 - $avArray is not a 1 or 2 dimensional array
|
|---|
| 988 | ; Author ........: Cephas <cephas at clergy dot net>
|
|---|
| 989 | ; Modified.......: Ultima - code cleanup
|
|---|
| 990 | ; Modified.......: BrewManNH - Added 2D array support
|
|---|
| 991 | ; Remarks .......: If the array has one element left, it will be set to "" after _ArrayPop() is used on it.
|
|---|
| 992 | ; Related .......: _ArrayAdd, _ArrayDelete, _ArrayInsert, _ArrayPush
|
|---|
| 993 | ; Link ..........:
|
|---|
| 994 | ; Example .......: Yes
|
|---|
| 995 | ; ===============================================================================================================================
|
|---|
| 996 | Func _ArrayPop(ByRef $avArray, $cDelim = "|")
|
|---|
| 997 | If (Not IsArray($avArray)) Then Return SetError(1, 0, "")
|
|---|
| 998 | If UBound($avArray, 0) > 2 Then Return SetError(2, 0, "")
|
|---|
| 999 | If UBound($avArray, 0) = 1 Then
|
|---|
| 1000 | Local $iUBound = UBound($avArray) - 1, $sLastVal = $avArray[$iUBound]
|
|---|
| 1001 | ; Remove last item
|
|---|
| 1002 | If Not $iUBound Then
|
|---|
| 1003 | $avArray = ""
|
|---|
| 1004 | Else
|
|---|
| 1005 | ReDim $avArray[$iUBound]
|
|---|
| 1006 | EndIf
|
|---|
| 1007 | ; Return last item
|
|---|
| 1008 | Return $sLastVal
|
|---|
| 1009 | Else
|
|---|
| 1010 | Local $iUBound = UBound($avArray) - 1, $iSubItems = UBound($avArray, 2)
|
|---|
| 1011 | Local $sLastVal
|
|---|
| 1012 | $sLastVal = $avArray[$iUBound][0] & $cDelim
|
|---|
| 1013 | For $j = 1 To $iSubItems - 1
|
|---|
| 1014 | $sLastVal &= $avArray[$iUBound][$j] & $cDelim
|
|---|
| 1015 | Next
|
|---|
| 1016 | ; Remove last item
|
|---|
| 1017 | If Not $iUBound Then
|
|---|
| 1018 | $avArray = ""
|
|---|
| 1019 | Else
|
|---|
| 1020 | ReDim $avArray[$iUBound][$iSubItems]
|
|---|
| 1021 | EndIf
|
|---|
| 1022 | ; Return last item
|
|---|
| 1023 | Return StringTrimRight($sLastVal, StringLen($cDelim))
|
|---|
| 1024 | EndIf
|
|---|
| 1025 | EndFunc ;==>_ArrayPop
|
|---|
| 1026 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 1027 | ; Name...........: _ArrayPush
|
|---|
| 1028 | ; Description ...: Add new values without increasing array size by inserting at the end the new value and deleting the first one or vice versa.
|
|---|
| 1029 | ; Syntax.........: _ArrayPush(ByRef $avArray, $vValue[, $iDirection = 0])
|
|---|
| 1030 | ; Parameters ....: $avArray - Array to modify
|
|---|
| 1031 | ; $vValue - Value(s) to add (can be in an array)
|
|---|
| 1032 | ; $iDirection - [optional] Direction to push existing array elements:
|
|---|
| 1033 | ; |0 = Slide left (adding at the end)
|
|---|
| 1034 | ; |1 = Slide right (adding at the start)
|
|---|
| 1035 | ; Return values .: Success - 1
|
|---|
| 1036 | ; Failure - 0, sets @error:
|
|---|
| 1037 | ; |1 - $avArray is not an array
|
|---|
| 1038 | ; |2 - $vValue is an array larger than $avArray (so it can't fit)
|
|---|
| 1039 | ; |3 - $avArray is not a 1 dimensional array
|
|---|
| 1040 | ; Author ........: Helias Gerassimou(hgeras), Ultima - code cleanup/rewrite (major optimization), fixed support for $vValue as an array
|
|---|
| 1041 | ; Modified.......:
|
|---|
| 1042 | ; Remarks .......: This function is used for continuous updates of data in array, where in other cases a vast size of array would be created.
|
|---|
| 1043 | ; It keeps all values inside the array (something like History), minus the first one or the last one depending on direction chosen.
|
|---|
| 1044 | ; It is similar to the push command in assembly.
|
|---|
| 1045 | ; Related .......: _ArrayAdd, _ArrayConcatenate, _ArrayDelete, _ArrayInsert, _ArrayPop
|
|---|
| 1046 | ; Link ..........:
|
|---|
| 1047 | ; Example .......: Yes
|
|---|
| 1048 | ; ===============================================================================================================================
|
|---|
| 1049 | Func _ArrayPush(ByRef $avArray, $vValue, $iDirection = 0)
|
|---|
| 1050 | If (Not IsArray($avArray)) Then Return SetError(1, 0, 0)
|
|---|
| 1051 | If UBound($avArray, 0) <> 1 Then Return SetError(3, 0, 0)
|
|---|
| 1052 | Local $iUBound = UBound($avArray) - 1
|
|---|
| 1053 | If IsArray($vValue) Then ; $vValue is an array
|
|---|
| 1054 | Local $iUBoundS = UBound($vValue)
|
|---|
| 1055 | If ($iUBoundS - 1) > $iUBound Then Return SetError(2, 0, 0)
|
|---|
| 1056 | ; $vValue is an array smaller than $avArray
|
|---|
| 1057 | If $iDirection Then ; slide right, add to front
|
|---|
| 1058 | For $i = $iUBound To $iUBoundS Step -1
|
|---|
| 1059 | $avArray[$i] = $avArray[$i - $iUBoundS]
|
|---|
| 1060 | Next
|
|---|
| 1061 | For $i = 0 To $iUBoundS - 1
|
|---|
| 1062 | $avArray[$i] = $vValue[$i]
|
|---|
| 1063 | Next
|
|---|
| 1064 | Else ; slide left, add to end
|
|---|
| 1065 | For $i = 0 To $iUBound - $iUBoundS
|
|---|
| 1066 | $avArray[$i] = $avArray[$i + $iUBoundS]
|
|---|
| 1067 | Next
|
|---|
| 1068 | For $i = 0 To $iUBoundS - 1
|
|---|
| 1069 | $avArray[$i + $iUBound - $iUBoundS + 1] = $vValue[$i]
|
|---|
| 1070 | Next
|
|---|
| 1071 | EndIf
|
|---|
| 1072 | Else
|
|---|
| 1073 | If $iDirection Then ; slide right, add to front
|
|---|
| 1074 | For $i = $iUBound To 1 Step -1
|
|---|
| 1075 | $avArray[$i] = $avArray[$i - 1]
|
|---|
| 1076 | Next
|
|---|
| 1077 | $avArray[0] = $vValue
|
|---|
| 1078 | Else ; slide left, add to end
|
|---|
| 1079 | For $i = 0 To $iUBound - 1
|
|---|
| 1080 | $avArray[$i] = $avArray[$i + 1]
|
|---|
| 1081 | Next
|
|---|
| 1082 | $avArray[$iUBound] = $vValue
|
|---|
| 1083 | EndIf
|
|---|
| 1084 | EndIf
|
|---|
| 1085 | Return 1
|
|---|
| 1086 | EndFunc ;==>_ArrayPush
|
|---|
| 1087 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 1088 | ; Name...........: _ArrayReverse
|
|---|
| 1089 | ; Description ...: Takes the given array and reverses the order in which the elements appear in the array.
|
|---|
| 1090 | ; Syntax.........: _ArrayReverse(ByRef $avArray[, $iStart = 0[, $iEnd = 0]])
|
|---|
| 1091 | ; Parameters ....: $avArray - Array to modify
|
|---|
| 1092 | ; $iStart - [optional] Index of array to start modifying at
|
|---|
| 1093 | ; $iEnd - [optional] Index of array to stop modifying at
|
|---|
| 1094 | ; Return values .: Success - 1
|
|---|
| 1095 | ; Failure - 0, sets @error:
|
|---|
| 1096 | ; |1 - $avArray is not an array
|
|---|
| 1097 | ; |2 - $iStart is greater than $iEnd
|
|---|
| 1098 | ; |3 - $avArray is not a 1 or 2 dimensional array
|
|---|
| 1099 | ; Author ........: Brian Keene
|
|---|
| 1100 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - added $iStart parameter and logic, Tylo - added $iEnd parameter and rewrote it for speed, Ultima - code cleanup, minor optimization
|
|---|
| 1101 | ; Modified.......: BrewManNH - Added 2D array support
|
|---|
| 1102 | ; Remarks .......:
|
|---|
| 1103 | ; Related .......: _ArraySwap
|
|---|
| 1104 | ; Link ..........:
|
|---|
| 1105 | ; Example .......: Yes
|
|---|
| 1106 | ; ===============================================================================================================================
|
|---|
| 1107 | Func _ArrayReverse(ByRef $avArray, $iStart = 0, $iEnd = 0)
|
|---|
| 1108 | If Not IsArray($avArray) Then Return SetError(1, 0, 0)
|
|---|
| 1109 | If UBound($avArray, 0) > 2 Then Return SetError(3, 0, 0)
|
|---|
| 1110 | Local $vTmp, $iUBound = UBound($avArray) - 1
|
|---|
| 1111 | ; Bounds checking
|
|---|
| 1112 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
|
|---|
| 1113 | If $iStart < 0 Then $iStart = 0
|
|---|
| 1114 | If $iStart > $iEnd Then Return SetError(2, 0, 0)
|
|---|
| 1115 | If UBound($avArray, 0) = 1 Then
|
|---|
| 1116 | ; Reverse
|
|---|
| 1117 | For $i = $iStart To Int(($iStart + $iEnd - 1) / 2)
|
|---|
| 1118 | $vTmp = $avArray[$i]
|
|---|
| 1119 | $avArray[$i] = $avArray[$iEnd]
|
|---|
| 1120 | $avArray[$iEnd] = $vTmp
|
|---|
| 1121 | $iEnd -= 1
|
|---|
| 1122 | Next
|
|---|
| 1123 | Return 1
|
|---|
| 1124 | Else
|
|---|
| 1125 | ; Reverse
|
|---|
| 1126 | For $i = $iStart To Int(($iStart + $iEnd - 1) / 2)
|
|---|
| 1127 | For $j = 0 To UBound($avArray, 2) - 1
|
|---|
| 1128 | $vTmp = $avArray[$i][$j]
|
|---|
| 1129 | $avArray[$i][$j] = $avArray[$iEnd][$j]
|
|---|
| 1130 | $avArray[$iEnd][$j] = $vTmp
|
|---|
| 1131 | Next
|
|---|
| 1132 | $iEnd -= 1
|
|---|
| 1133 | Next
|
|---|
| 1134 | Return 1
|
|---|
| 1135 | EndIf
|
|---|
| 1136 | EndFunc ;==>_ArrayReverse
|
|---|
| 1137 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 1138 | ; Name...........: _ArraySearch
|
|---|
| 1139 | ; Description ...: Finds an entry within a 1D or 2D array. Similar to _ArrayBinarySearch(), except that the array does not need to be sorted.
|
|---|
| 1140 | ; Syntax.........: _ArraySearch(Const ByRef $avArray, $vValue[, $iStart = 0[, $iEnd = 0[, $iCase = 0[, $iPartial = 0[, $iForward = 1[, $iSubItem = -1]]]]]])
|
|---|
| 1141 | ; Parameters ....: $avArray - The array to search
|
|---|
| 1142 | ; $vValue - What to search $avArray for
|
|---|
| 1143 | ; $iStart - [optional] Index of array to start searching at
|
|---|
| 1144 | ; $iEnd - [optional] Index of array to stop searching at
|
|---|
| 1145 | ; $iCase - [optional] If set to 1, search is case sensitive
|
|---|
| 1146 | ; $iPartial - [optional] If set to 1, executes a partial search
|
|---|
| 1147 | ; $iForward - [optional] If set to 0, searches the array from end to beginning (instead of beginning to end)
|
|---|
| 1148 | ; $iSubItem - [optional] Sub-index to search on in 2D arrays
|
|---|
| 1149 | ; Return values .: Success - The index that $vValue was found at
|
|---|
| 1150 | ; Failure - -1, sets @error:
|
|---|
| 1151 | ; |1 - $avArray is not an array
|
|---|
| 1152 | ; |2 - $avArray is not a 1 or 2 dimensional array
|
|---|
| 1153 | ; |4 - $iStart is greater than $iEnd
|
|---|
| 1154 | ; |6 - $vValue was not found in array
|
|---|
| 1155 | ; |7 - $avArray has too many dimensions
|
|---|
| 1156 | ; |(3, 5 - Deprecated error codes)
|
|---|
| 1157 | ; Author ........: SolidSnake <MetalGX91 at GMail dot com>
|
|---|
| 1158 | ; Modified.......: gcriaco <gcriaco at gmail dot com>, Ultima - 2D arrays supported, directional search, code cleanup, optimization
|
|---|
| 1159 | ; Remarks .......: This function might be slower than _ArrayBinarySearch() but is useful when the array's order can't be altered.
|
|---|
| 1160 | ; Related .......: _ArrayBinarySearch, _ArrayFindAll
|
|---|
| 1161 | ; Link ..........:
|
|---|
| 1162 | ; Example .......: Yes
|
|---|
| 1163 | ; ===============================================================================================================================
|
|---|
| 1164 | Func _ArraySearch(Const ByRef $avArray, $vValue, $iStart = 0, $iEnd = 0, $iCase = 0, $iPartial = 0, $iForward = 1, $iSubItem = -1)
|
|---|
| 1165 | If Not IsArray($avArray) Then Return SetError(1, 0, -1)
|
|---|
| 1166 | If UBound($avArray, 0) > 2 Or UBound($avArray, 0) < 1 Then Return SetError(2, 0, -1)
|
|---|
| 1167 | Local $iUBound = UBound($avArray) - 1
|
|---|
| 1168 | ; Bounds checking
|
|---|
| 1169 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
|
|---|
| 1170 | If $iStart < 0 Then $iStart = 0
|
|---|
| 1171 | If $iStart > $iEnd Then Return SetError(4, 0, -1)
|
|---|
| 1172 | ; Direction (flip if $iForward = 0)
|
|---|
| 1173 | Local $iStep = 1
|
|---|
| 1174 | If Not $iForward Then
|
|---|
| 1175 | Local $iTmp = $iStart
|
|---|
| 1176 | $iStart = $iEnd
|
|---|
| 1177 | $iEnd = $iTmp
|
|---|
| 1178 | $iStep = -1
|
|---|
| 1179 | EndIf
|
|---|
| 1180 | ; Search
|
|---|
| 1181 | Switch UBound($avArray, 0)
|
|---|
| 1182 | Case 1 ; 1D array search
|
|---|
| 1183 | If Not $iPartial Then
|
|---|
| 1184 | If Not $iCase Then
|
|---|
| 1185 | For $i = $iStart To $iEnd Step $iStep
|
|---|
| 1186 | If $avArray[$i] = $vValue Then Return $i
|
|---|
| 1187 | Next
|
|---|
| 1188 | Else
|
|---|
| 1189 | For $i = $iStart To $iEnd Step $iStep
|
|---|
| 1190 | If $avArray[$i] == $vValue Then Return $i
|
|---|
| 1191 | Next
|
|---|
| 1192 | EndIf
|
|---|
| 1193 | Else
|
|---|
| 1194 | For $i = $iStart To $iEnd Step $iStep
|
|---|
| 1195 | If StringInStr($avArray[$i], $vValue, $iCase) > 0 Then Return $i
|
|---|
| 1196 | Next
|
|---|
| 1197 | EndIf
|
|---|
| 1198 | Case 2 ; 2D array search
|
|---|
| 1199 | Local $iUBoundSub = UBound($avArray, 2) - 1
|
|---|
| 1200 | If $iSubItem > $iUBoundSub Then $iSubItem = $iUBoundSub
|
|---|
| 1201 | If $iSubItem < 0 Then
|
|---|
| 1202 | ; will search for all Col
|
|---|
| 1203 | $iSubItem = 0
|
|---|
| 1204 | Else
|
|---|
| 1205 | $iUBoundSub = $iSubItem
|
|---|
| 1206 | EndIf
|
|---|
| 1207 | For $j = $iSubItem To $iUBoundSub
|
|---|
| 1208 | If Not $iPartial Then
|
|---|
| 1209 | If Not $iCase Then
|
|---|
| 1210 | For $i = $iStart To $iEnd Step $iStep
|
|---|
| 1211 | If $avArray[$i][$j] = $vValue Then Return $i
|
|---|
| 1212 | Next
|
|---|
| 1213 | Else
|
|---|
| 1214 | For $i = $iStart To $iEnd Step $iStep
|
|---|
| 1215 | If $avArray[$i][$j] == $vValue Then Return $i
|
|---|
| 1216 | Next
|
|---|
| 1217 | EndIf
|
|---|
| 1218 | Else
|
|---|
| 1219 | For $i = $iStart To $iEnd Step $iStep
|
|---|
| 1220 | If StringInStr($avArray[$i][$j], $vValue, $iCase) > 0 Then Return $i
|
|---|
| 1221 | Next
|
|---|
| 1222 | EndIf
|
|---|
| 1223 | Next
|
|---|
| 1224 | Case Else
|
|---|
| 1225 | Return SetError(7, 0, -1)
|
|---|
| 1226 | EndSwitch
|
|---|
| 1227 | Return SetError(6, 0, -1)
|
|---|
| 1228 | EndFunc ;==>_ArraySearch
|
|---|
| 1229 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 1230 | ; Name...........: _ArraySort
|
|---|
| 1231 | ; Description ...: Sort a 1D or 2D array on a specific index using the quicksort/insertionsort algorithms.
|
|---|
| 1232 | ; Syntax.........: _ArraySort(ByRef $avArray[, $iDescending = 0[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]]])
|
|---|
| 1233 | ; Parameters ....: $avArray - Array to sort
|
|---|
| 1234 | ; $iDescending - [optional] If set to 1, sort descendingly
|
|---|
| 1235 | ; $iStart - [optional] Index of array to start sorting at
|
|---|
| 1236 | ; $iEnd - [optional] Index of array to stop sorting at
|
|---|
| 1237 | ; $iSubItem - [optional] Sub-index to sort on in 2D arrays
|
|---|
| 1238 | ; Return values .: Success - 1
|
|---|
| 1239 | ; Failure - 0, sets @error:
|
|---|
| 1240 | ; |1 - $avArray is not an array
|
|---|
| 1241 | ; |2 - $iStart is greater than $iEnd
|
|---|
| 1242 | ; |3 - $iSubItem is greater than subitem count
|
|---|
| 1243 | ; |4 - $avArray has too many dimensions
|
|---|
| 1244 | ; Author ........: Jos van der Zande <jdeb at autoitscript dot com>
|
|---|
| 1245 | ; Modified.......: LazyCoder - added $iSubItem option, Tylo - implemented stable QuickSort algo, Jos van der Zande - changed logic to correctly Sort arrays with mixed Values and Strings, Ultima - major optimization, code cleanup, removed $i_Dim parameter
|
|---|
| 1246 | ; Remarks .......:
|
|---|
| 1247 | ; Related .......:
|
|---|
| 1248 | ; Link ..........:
|
|---|
| 1249 | ; Example .......: Yes
|
|---|
| 1250 | ; ===============================================================================================================================
|
|---|
| 1251 | Func _ArraySort(ByRef $avArray, $iDescending = 0, $iStart = 0, $iEnd = 0, $iSubItem = 0)
|
|---|
| 1252 | If Not IsArray($avArray) Then Return SetError(1, 0, 0)
|
|---|
| 1253 | Local $iUBound = UBound($avArray) - 1
|
|---|
| 1254 | ; Bounds checking
|
|---|
| 1255 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
|
|---|
| 1256 | If $iStart < 0 Then $iStart = 0
|
|---|
| 1257 | If $iStart > $iEnd Then Return SetError(2, 0, 0)
|
|---|
| 1258 | ; Sort
|
|---|
| 1259 | Switch UBound($avArray, 0)
|
|---|
| 1260 | Case 1
|
|---|
| 1261 | __ArrayQuickSort1D($avArray, $iStart, $iEnd)
|
|---|
| 1262 | If $iDescending Then _ArrayReverse($avArray, $iStart, $iEnd)
|
|---|
| 1263 | Case 2
|
|---|
| 1264 | Local $iSubMax = UBound($avArray, 2) - 1
|
|---|
| 1265 | If $iSubItem > $iSubMax Then Return SetError(3, 0, 0)
|
|---|
| 1266 | If $iDescending Then
|
|---|
| 1267 | $iDescending = -1
|
|---|
| 1268 | Else
|
|---|
| 1269 | $iDescending = 1
|
|---|
| 1270 | EndIf
|
|---|
| 1271 | __ArrayQuickSort2D($avArray, $iDescending, $iStart, $iEnd, $iSubItem, $iSubMax)
|
|---|
| 1272 | Case Else
|
|---|
| 1273 | Return SetError(4, 0, 0)
|
|---|
| 1274 | EndSwitch
|
|---|
| 1275 | Return 1
|
|---|
| 1276 | EndFunc ;==>_ArraySort
|
|---|
| 1277 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 1278 | ; Name...........: _ArraySwap
|
|---|
| 1279 | ; Description ...: Swaps two items.
|
|---|
| 1280 | ; Syntax.........: _ArraySwap(ByRef $vItem1, ByRef $vItem2)
|
|---|
| 1281 | ; Parameters ....: $vItem1 - First item to swap
|
|---|
| 1282 | ; $vItem2 - Second item to swap
|
|---|
| 1283 | ; Return values .: None.
|
|---|
| 1284 | ; Author ........: David Nuttall <danuttall at rocketmail dot com>
|
|---|
| 1285 | ; Modified.......: Ultima - minor optimization
|
|---|
| 1286 | ; Remarks .......: This function swaps the two items in place, since they're passed by reference. Regular, non-array variables can also be swapped by this function.
|
|---|
| 1287 | ; Related .......: _ArrayReverse
|
|---|
| 1288 | ; Link ..........:
|
|---|
| 1289 | ; Example .......: Yes
|
|---|
| 1290 | ; ===============================================================================================================================
|
|---|
| 1291 | Func _ArraySwap(ByRef $vItem1, ByRef $vItem2)
|
|---|
| 1292 | Local $vTmp = $vItem1
|
|---|
| 1293 | $vItem1 = $vItem2
|
|---|
| 1294 | $vItem2 = $vTmp
|
|---|
| 1295 | EndFunc ;==>_ArraySwap
|
|---|
| 1296 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 1297 | ; Name...........: _ArrayToClip
|
|---|
| 1298 | ; Description ...: Sends the contents of an array to the clipboard, each element delimited by a carriage return.
|
|---|
| 1299 | ; Syntax.........: _ArrayToClip(Const ByRef $avArray[, $iStart = 0[, $iEnd = 0[, $iSubItem = 0]]])
|
|---|
| 1300 | ; Parameters ....: $avArray - Array to copy to clipboard
|
|---|
| 1301 | ; $iStart - [optional] Index of array to start copying at
|
|---|
| 1302 | ; $iEnd - [optional] Index of array to stop copying at
|
|---|
| 1303 | ; $iSubItem- [optional] Dimension of array to copy
|
|---|
| 1304 | ; Return values .: Success - 1
|
|---|
| 1305 | ; Failure - 0, sets @error:
|
|---|
| 1306 | ; |-1 - ClipPut() failed
|
|---|
| 1307 | ; |Other - See _ArrayToString() description for error codes
|
|---|
| 1308 | ; Author ........: Cephas <cephas at clergy dot net>
|
|---|
| 1309 | ; Modified.......: Jos van der Zande <jdeb at autoitscript dot com> - added $iStart parameter and logic, Ultima - added $iEnd parameter, make use of _ArrayToString() instead of duplicating efforts
|
|---|
| 1310 | ; Remarks .......:
|
|---|
| 1311 | ; Related .......: _ArrayToString
|
|---|
| 1312 | ; Link ..........:
|
|---|
| 1313 | ; Example .......: Yes
|
|---|
| 1314 | ; ===============================================================================================================================
|
|---|
| 1315 | Func _ArrayToClip(Const ByRef $avArray, $iStart = 0, $iEnd = 0, $iSubItem = 0)
|
|---|
| 1316 | If UBound($avArray, 0) = 1 Then
|
|---|
| 1317 | Local $sResult = _ArrayToString($avArray, @CR, $iStart, $iEnd)
|
|---|
| 1318 | If @error Then Return SetError(@error, 0, 0)
|
|---|
| 1319 | Return ClipPut($sResult)
|
|---|
| 1320 | Else
|
|---|
| 1321 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1
|
|---|
| 1322 | If $iSubItem < 1 Then $iSubItem = 0
|
|---|
| 1323 | Local $sResult = _ArrayToString($avArray, @CR, $iStart, $iEnd, $iSubItem)
|
|---|
| 1324 | If @error Then Return SetError(@error, 0, 0)
|
|---|
| 1325 | Return ClipPut($sResult)
|
|---|
| 1326 | EndIf
|
|---|
| 1327 | EndFunc ;==>_ArrayToClip
|
|---|
| 1328 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 1329 | ; Name...........: _ArrayToString
|
|---|
| 1330 | ; Description ...: Places the elements of an array into a single string, separated by the specified delimiter.
|
|---|
| 1331 | ; Syntax.........: _ArrayToString(Const ByRef $avArray[, $sDelim = "|"[, $iStart = 0[, $iEnd = 0]]])
|
|---|
| 1332 | ; Parameters ....: $avArray - Array to combine
|
|---|
| 1333 | ; $sDelim - [optional] Delimiter for combined string
|
|---|
| 1334 | ; $iStart - [optional] Index of array to start combining at
|
|---|
| 1335 | ; $iEnd - [optional] Index of array to stop combining at
|
|---|
| 1336 | ; $iSubItem- [optional] Subitem to copy
|
|---|
| 1337 | ; Return values .: Success - string which combined selected elements separated by the delimiter string.
|
|---|
| 1338 | ; Failure - "", sets @error:
|
|---|
| 1339 | ; |1 - $avArray is not an array
|
|---|
| 1340 | ; |2 - $iStart is greater than $iEnd
|
|---|
| 1341 | ; |3 - $avArray is not an 1 or 2 dimensional array
|
|---|
| 1342 | ; Author ........: Brian Keene <brian_keene at yahoo dot com>, Valik - rewritten
|
|---|
| 1343 | ; Modified.......: Ultima - code cleanup
|
|---|
| 1344 | ; Modified.......: BrewManNH - Added 2D array support
|
|---|
| 1345 | ; Remarks .......:
|
|---|
| 1346 | ; Related .......: StringSplit, _ArrayToClip
|
|---|
| 1347 | ; Link ..........:
|
|---|
| 1348 | ; Example .......: Yes
|
|---|
| 1349 | ; ===============================================================================================================================
|
|---|
| 1350 | Func _ArrayToString(Const ByRef $avArray, $sDelim = "|", $iStart = 0, $iEnd = 0, $iSubItem = 0)
|
|---|
| 1351 | If Not IsArray($avArray) Then Return SetError(1, 0, "")
|
|---|
| 1352 | If UBound($avArray, 0) > 2 Then Return SetError(3, 0, "")
|
|---|
| 1353 | Local $sResult, $iUBound = UBound($avArray) - 1
|
|---|
| 1354 | ; Bounds checking
|
|---|
| 1355 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
|
|---|
| 1356 | If $iStart < 0 Then $iStart = 0
|
|---|
| 1357 | If $iStart > $iEnd Then Return SetError(2, 0, "")
|
|---|
| 1358 | If UBound($avArray, 0) = 1 Then
|
|---|
| 1359 | ; Combine
|
|---|
| 1360 | For $i = $iStart To $iEnd
|
|---|
| 1361 | $sResult &= $avArray[$i] & $sDelim
|
|---|
| 1362 | Next
|
|---|
| 1363 | Return StringTrimRight($sResult, StringLen($sDelim))
|
|---|
| 1364 | Else
|
|---|
| 1365 | If $iSubItem > UBound($avArray, 2) - 1 Then $iSubItem = UBound($avArray, 2) - 1
|
|---|
| 1366 | If $iSubItem < 1 Then $iSubItem = 0
|
|---|
| 1367 | ; Combine
|
|---|
| 1368 | For $i = $iStart To $iEnd
|
|---|
| 1369 | $sResult &= $avArray[$i][$iSubItem] & $sDelim
|
|---|
| 1370 | Next
|
|---|
| 1371 | Return StringTrimRight($sResult, StringLen($sDelim))
|
|---|
| 1372 | EndIf
|
|---|
| 1373 | EndFunc ;==>_ArrayToString
|
|---|
| 1374 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 1375 | ; Name...........: _ArrayTrim
|
|---|
| 1376 | ; Description ...: Trims a certain number of characters from all elements in an array.
|
|---|
| 1377 | ; Syntax.........: _ArrayTrim(ByRef $avArray, $iTrimNum[, $iDirection = 0[, $iStart = 0[, $iEnd = 0]]])
|
|---|
| 1378 | ; Parameters ....: $avArray - Array to modify
|
|---|
| 1379 | ; $iTrimNum - Number of characters to remove
|
|---|
| 1380 | ; $iDirection - [optional] Direction to trim:
|
|---|
| 1381 | ; |0 - trim left
|
|---|
| 1382 | ; |1 - trim right
|
|---|
| 1383 | ; $iStart - [optional] Index of array to start trimming at
|
|---|
| 1384 | ; $iEnd - [optional] Index of array to stop trimming at
|
|---|
| 1385 | ; Return values .: Success - 1
|
|---|
| 1386 | ; Failure - 0, sets @error:
|
|---|
| 1387 | ; |1 - $avArray is not an array
|
|---|
| 1388 | ; |2 - $avArray is not an 1 or 2 dimensional array
|
|---|
| 1389 | ; |5 - $iStart is greater than $iEnd
|
|---|
| 1390 | ; |(3-4 - Deprecated error codes)
|
|---|
| 1391 | ; Author ........: Adam Moore (redndahead)
|
|---|
| 1392 | ; Modified.......: Ultima - code cleanup, optimization
|
|---|
| 1393 | ; Remarks .......:
|
|---|
| 1394 | ; Related .......:
|
|---|
| 1395 | ; Link ..........:
|
|---|
| 1396 | ; Example .......: Yes
|
|---|
| 1397 | ; ===============================================================================================================================
|
|---|
| 1398 | Func _ArrayTrim(ByRef $avArray, $iTrimNum, $iDirection = 0, $iStart = 0, $iEnd = 0)
|
|---|
| 1399 | If Not IsArray($avArray) Then Return SetError(1, 0, 0)
|
|---|
| 1400 | If UBound($avArray, 0) > 2 Then Return SetError(2, 0, 0)
|
|---|
| 1401 | Local $iUBound = UBound($avArray) - 1
|
|---|
| 1402 | ; Bounds checking
|
|---|
| 1403 | If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
|
|---|
| 1404 | If $iStart < 0 Then $iStart = 0
|
|---|
| 1405 | If $iStart > $iEnd Then Return SetError(5, 0, 0)
|
|---|
| 1406 | If UBound($avArray, 0) = 1 Then
|
|---|
| 1407 | ; Trim
|
|---|
| 1408 | If $iDirection Then
|
|---|
| 1409 | For $i = $iStart To $iEnd
|
|---|
| 1410 | $avArray[$i] = StringTrimRight($avArray[$i], $iTrimNum)
|
|---|
| 1411 | Next
|
|---|
| 1412 | Else
|
|---|
| 1413 | For $i = $iStart To $iEnd
|
|---|
| 1414 | $avArray[$i] = StringTrimLeft($avArray[$i], $iTrimNum)
|
|---|
| 1415 | Next
|
|---|
| 1416 | EndIf
|
|---|
| 1417 | Return 1
|
|---|
| 1418 | Else
|
|---|
| 1419 | ; Trim
|
|---|
| 1420 | If $iDirection Then
|
|---|
| 1421 | For $i = $iStart To $iEnd
|
|---|
| 1422 | For $j = 0 To UBound($avArray, 2) - 1
|
|---|
| 1423 | $avArray[$i][$j] = StringTrimRight($avArray[$i][$j], $iTrimNum)
|
|---|
| 1424 | Next
|
|---|
| 1425 | Next
|
|---|
| 1426 | Else
|
|---|
| 1427 | For $i = $iStart To $iEnd
|
|---|
| 1428 | For $j = 0 To UBound($avArray, 2) - 1
|
|---|
| 1429 | $avArray[$i][$j] = StringTrimLeft($avArray[$i][$j], $iTrimNum)
|
|---|
| 1430 | Next
|
|---|
| 1431 | Next
|
|---|
| 1432 | EndIf
|
|---|
| 1433 | Return 1
|
|---|
| 1434 | EndIf
|
|---|
| 1435 | EndFunc ;==>_ArrayTrim
|
|---|
| 1436 | ; #FUNCTION# ====================================================================================================================
|
|---|
| 1437 | ; Name...........: _ArrayUnique
|
|---|
| 1438 | ; Description ...: Returns the Elements of a 1 or 2-dimensional array deleting all duplicate items
|
|---|
| 1439 | ; Syntax.........: _ArrayUnique($aArray[, $iDimension = 1[, $iBase = 0[, $iCase = 0[, $vDelim = "|"]]]])
|
|---|
| 1440 | ; Parameters ....: $aArray - The Array to use
|
|---|
| 1441 | ; $iDimension - [optional] The Dimension of the Array to use
|
|---|
| 1442 | ; $iBase - [optional] Is the Array 0-base or 1-base index. 0-base by default
|
|---|
| 1443 | ; $iCase - [optional] Flag to indicate if the operations should be case sensitive.
|
|---|
| 1444 | ; 0 = not case sensitive, using the user's locale (default)
|
|---|
| 1445 | ; 1 = case sensitive
|
|---|
| 1446 | ; 2 = not case sensitive, using a basic/faster comparison
|
|---|
| 1447 | ; $vDelim - [optional] One or more characters to use as delimiters. However, cannot forsee its usefullness
|
|---|
| 1448 | ; Return values .: Success - Returns a 1-dimensional array containing only the unique elements of that Dimension
|
|---|
| 1449 | ; Failure - Returns 0 and Sets @Error:
|
|---|
| 1450 | ; 0 - No error.
|
|---|
| 1451 | ; 1 - Returns 0 if parameter is not an array.
|
|---|
| 1452 | ; 2 - _ArrayUnique failed for some other reason
|
|---|
| 1453 | ; 3 - Array dimension is invalid, should be an integer greater than 0
|
|---|
| 1454 | ; Author ........: SmOke_N
|
|---|
| 1455 | ; Modified.......: litlmike
|
|---|
| 1456 | ; Remarks .......: Returns an array, the first element ($array[0]) contains the number of strings returned, the remaining elements ($array[1], $array[2], etc.) contain the unique strings.
|
|---|
| 1457 | ; Related .......: _ArrayMax, _ArrayMin
|
|---|
| 1458 | ; Link ..........:
|
|---|
| 1459 | ; Example .......: Yes
|
|---|
| 1460 | ; ===============================================================================================================================
|
|---|
| 1461 | Func _ArrayUnique($aArray, $iDimension = 1, $iBase = 0, $iCase = 0, $vDelim = "|")
|
|---|
| 1462 | Local $iUboundDim
|
|---|
| 1463 | ;$aArray used to be ByRef, but litlmike altered it to allow for the choosing of 1 Array Dimension, without altering the original array
|
|---|
| 1464 | If $vDelim = "|" Then $vDelim = Chr(01) ; by SmOke_N, modified by litlmike
|
|---|
| 1465 | If Not IsArray($aArray) Then Return SetError(1, 0, 0) ;Check to see if it is valid array
|
|---|
| 1466 | ;Checks that the given Dimension is Valid
|
|---|
| 1467 | If Not $iDimension > 0 Then
|
|---|
| 1468 | Return SetError(3, 0, 0) ;Check to see if it is valid array dimension, Should be greater than 0
|
|---|
| 1469 | Else
|
|---|
| 1470 | ;If Dimension Exists, then get the number of "Rows"
|
|---|
| 1471 | $iUboundDim = UBound($aArray, 1) ;Get Number of "Rows"
|
|---|
| 1472 | If @error Then Return SetError(3, 0, 0) ;2 = Array dimension is invalid.
|
|---|
| 1473 | ;If $iDimension Exists, And the number of "Rows" is Valid:
|
|---|
| 1474 | If $iDimension > 1 Then ;Makes sure the Array dimension desired is more than 1-dimensional
|
|---|
| 1475 | Local $aArrayTmp[1] ;Declare blank array, which will hold the dimension declared by user
|
|---|
| 1476 | For $i = 0 To $iUboundDim - 1 ;Loop through "Rows"
|
|---|
| 1477 | _ArrayAdd($aArrayTmp, $aArray[$i][$iDimension - 1]) ;$iDimension-1 to match Dimension
|
|---|
| 1478 | Next
|
|---|
| 1479 | _ArrayDelete($aArrayTmp, 0) ;Get rid of 1st-element which is blank
|
|---|
| 1480 | Else ;Makes sure the Array dimension desired is 1-dimensional
|
|---|
| 1481 | ;If Dimension Exists, And the number of "Rows" is Valid, and the Dimension desired is not > 1, then:
|
|---|
| 1482 | ;For the Case that the array is 1-Dimensional
|
|---|
| 1483 | If UBound($aArray, 0) = 1 Then ;Makes sure the Array is only 1-Dimensional
|
|---|
| 1484 | Dim $aArrayTmp[1] ;Declare blank array, which will hold the dimension declared by user
|
|---|
| 1485 | For $i = 0 To $iUboundDim - 1
|
|---|
| 1486 | _ArrayAdd($aArrayTmp, $aArray[$i])
|
|---|
| 1487 | Next
|
|---|
| 1488 | _ArrayDelete($aArrayTmp, 0) ;Get rid of 1st-element which is blank
|
|---|
| 1489 | Else ;For the Case that the array is 2-Dimensional
|
|---|
| 1490 | Dim $aArrayTmp[1] ;Declare blank array, which will hold the dimension declared by user
|
|---|
| 1491 | For $i = 0 To $iUboundDim - 1
|
|---|
| 1492 | _ArrayAdd($aArrayTmp, $aArray[$i][$iDimension - 1]) ;$iDimension-1 to match Dimension
|
|---|
| 1493 | Next
|
|---|
| 1494 | _ArrayDelete($aArrayTmp, 0) ;Get rid of 1st-element which is blank
|
|---|
| 1495 | EndIf
|
|---|
| 1496 | EndIf
|
|---|
| 1497 | EndIf
|
|---|
| 1498 | Local $sHold ;String that holds the Unique array info
|
|---|
| 1499 | For $iCC = $iBase To UBound($aArrayTmp) - 1 ;Loop Through array
|
|---|
| 1500 | ;If Not the case that the element is already in $sHold, then add it
|
|---|
| 1501 | If Not StringInStr($vDelim & $sHold, $vDelim & $aArrayTmp[$iCC] & $vDelim, $iCase) Then _
|
|---|
| 1502 | $sHold &= $aArrayTmp[$iCC] & $vDelim
|
|---|
| 1503 | Next
|
|---|
| 1504 | If $sHold Then
|
|---|
| 1505 | $aArrayTmp = StringSplit(StringTrimRight($sHold, StringLen($vDelim)), $vDelim, 1) ;Split the string into an array
|
|---|
| 1506 | Return $aArrayTmp ;SmOke_N's version used to Return SetError(0, 0, 0)
|
|---|
| 1507 | EndIf
|
|---|
| 1508 | Return SetError(2, 0, 0) ;If the script gets this far, it has failed
|
|---|
| 1509 | EndFunc ;==>_ArrayUnique
|
|---|
| 1510 | ; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|---|
| 1511 | ; Name...........: __Array_Combinations
|
|---|
| 1512 | ; Description ...: Creates Combination
|
|---|
| 1513 | ; Syntax.........: __Array_Combinations($iN, $iR)
|
|---|
| 1514 | ; Parameters ....: $iN - Value passed on from UBound($avArray)
|
|---|
| 1515 | ; $iR - Size of the combinations set
|
|---|
| 1516 | ; Return values .: Integer value of the number of combinations
|
|---|
| 1517 | ; Author ........: Erik Pilsits
|
|---|
| 1518 | ; Modified.......: 07/08/2008
|
|---|
| 1519 | ; Remarks .......: This function is used internally. PBased on an algorithm by Kenneth H. Rosen.
|
|---|
| 1520 | ;+
|
|---|
| 1521 | ; http://www.bearcave.com/random_hacks/permute.html
|
|---|
| 1522 | ; Related .......:
|
|---|
| 1523 | ; Link ..........:
|
|---|
| 1524 | ; Example .......:
|
|---|
| 1525 | ; ===============================================================================================================================
|
|---|
| 1526 | Func __Array_Combinations($iN, $iR)
|
|---|
| 1527 | Local $i_Total = 1
|
|---|
| 1528 | For $i = $iR To 1 Step -1
|
|---|
| 1529 | $i_Total *= ($iN / $i)
|
|---|
| 1530 | $iN -= 1
|
|---|
| 1531 | Next
|
|---|
| 1532 | Return Round($i_Total)
|
|---|
| 1533 | EndFunc ;==>__Array_Combinations
|
|---|
| 1534 | ; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|---|
| 1535 | ; Name...........: __Array_ExeterInternal
|
|---|
| 1536 | ; Description ...: Permute Function based on an algorithm from Exeter University.
|
|---|
| 1537 | ; Syntax.........: __Array_ExeterInternal(ByRef $avArray, $iStart, $iSize, $sDelim, ByRef $aIdx, ByRef $aResult)
|
|---|
| 1538 | ; Parameters ....: $avArray - The Array to get Permutations
|
|---|
| 1539 | ; $iStart - Starting Point for Loop
|
|---|
| 1540 | ; $iSize - End Point for Loop
|
|---|
| 1541 | ; $sDelim - String result separator
|
|---|
| 1542 | ; $aIdx - Array Used in Rotations
|
|---|
| 1543 | ; $aResult - Resulting Array
|
|---|
| 1544 | ; Return values .: Success - Computer name
|
|---|
| 1545 | ; Author ........: Erik Pilsits
|
|---|
| 1546 | ; Modified.......: 07/08/2008
|
|---|
| 1547 | ; Remarks .......: This function is used internally. Permute Function based on an algorithm from Exeter University.
|
|---|
| 1548 | ;+
|
|---|
| 1549 | ; http://www.bearcave.com/random_hacks/permute.html
|
|---|
| 1550 | ; Related .......:
|
|---|
| 1551 | ; Link ..........:
|
|---|
| 1552 | ; Example .......:
|
|---|
| 1553 | ; ===============================================================================================================================
|
|---|
| 1554 | Func __Array_ExeterInternal(ByRef $avArray, $iStart, $iSize, $sDelim, ByRef $aIdx, ByRef $aResult, ByRef $iCount)
|
|---|
| 1555 | If $iStart == $iSize - 1 Then
|
|---|
| 1556 | For $i = 0 To $iSize - 1
|
|---|
| 1557 | $aResult[$iCount] &= $avArray[$aIdx[$i]] & $sDelim
|
|---|
| 1558 | Next
|
|---|
| 1559 | If $sDelim <> "" Then $aResult[$iCount] = StringTrimRight($aResult[$iCount], 1)
|
|---|
| 1560 | $iCount += 1
|
|---|
| 1561 | Else
|
|---|
| 1562 | Local $iTemp
|
|---|
| 1563 | For $i = $iStart To $iSize - 1
|
|---|
| 1564 | $iTemp = $aIdx[$i]
|
|---|
| 1565 | $aIdx[$i] = $aIdx[$iStart]
|
|---|
| 1566 | $aIdx[$iStart] = $iTemp
|
|---|
| 1567 | __Array_ExeterInternal($avArray, $iStart + 1, $iSize, $sDelim, $aIdx, $aResult, $iCount)
|
|---|
| 1568 | $aIdx[$iStart] = $aIdx[$i]
|
|---|
| 1569 | $aIdx[$i] = $iTemp
|
|---|
| 1570 | Next
|
|---|
| 1571 | EndIf
|
|---|
| 1572 | EndFunc ;==>__Array_ExeterInternal
|
|---|
| 1573 | ; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|---|
| 1574 | ; Name...........: __Array_GetNext
|
|---|
| 1575 | ; Description ...: Creates Combination
|
|---|
| 1576 | ; Syntax.........: __Array_GetNext($iN, $iR, ByRef $iLeft, $iTotal, ByRef $aIdx)
|
|---|
| 1577 | ; Parameters ....: $iN - Value passed on from UBound($avArray)
|
|---|
| 1578 | ; $iR - Size of the combinations set
|
|---|
| 1579 | ; $iLeft - Remaining number of combinations
|
|---|
| 1580 | ; $iTotal - Total number of combinations
|
|---|
| 1581 | ; $aIdx - Array containing combinations
|
|---|
| 1582 | ; Return values .: Function only changes values ByRef
|
|---|
| 1583 | ; Author ........: Erik Pilsits
|
|---|
| 1584 | ; Modified.......: 07/08/2008
|
|---|
| 1585 | ; Remarks .......: This function is used internally. PBased on an algorithm by Kenneth H. Rosen.
|
|---|
| 1586 | ;+
|
|---|
| 1587 | ; http://www.bearcave.com/random_hacks/permute.html
|
|---|
| 1588 | ; Related .......:
|
|---|
| 1589 | ; Link ..........:
|
|---|
| 1590 | ; Example .......:
|
|---|
| 1591 | ; ===============================================================================================================================
|
|---|
| 1592 | Func __Array_GetNext($iN, $iR, ByRef $iLeft, $iTotal, ByRef $aIdx)
|
|---|
| 1593 | If $iLeft == $iTotal Then
|
|---|
| 1594 | $iLeft -= 1
|
|---|
| 1595 | Return
|
|---|
| 1596 | EndIf
|
|---|
| 1597 | Local $i = $iR - 1
|
|---|
| 1598 | While $aIdx[$i] == $iN - $iR + $i
|
|---|
| 1599 | $i -= 1
|
|---|
| 1600 | WEnd
|
|---|
| 1601 | $aIdx[$i] += 1
|
|---|
| 1602 | For $j = $i + 1 To $iR - 1
|
|---|
| 1603 | $aIdx[$j] = $aIdx[$i] + $j - $i
|
|---|
| 1604 | Next
|
|---|
| 1605 | $iLeft -= 1
|
|---|
| 1606 | EndFunc ;==>__Array_GetNext
|
|---|
| 1607 | ; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|---|
| 1608 | ; Name...........: __ArrayQuickSort1D
|
|---|
| 1609 | ; Description ...: Helper function for sorting 1D arrays
|
|---|
| 1610 | ; Syntax.........: __ArrayQuickSort1D(ByRef $avArray, ByRef $iStart, ByRef $iEnd)
|
|---|
| 1611 | ; Parameters ....: $avArray - Array to sort
|
|---|
| 1612 | ; $iStart - Index of array to start sorting at
|
|---|
| 1613 | ; $iEnd - Index of array to stop sorting at
|
|---|
| 1614 | ; Return values .: None
|
|---|
| 1615 | ; Author ........: Jos van der Zande, LazyCoder, Tylo, Ultima
|
|---|
| 1616 | ; Modified.......:
|
|---|
| 1617 | ; Remarks .......: For Internal Use Only
|
|---|
| 1618 | ; Related .......:
|
|---|
| 1619 | ; Link ..........:
|
|---|
| 1620 | ; Example .......:
|
|---|
| 1621 | ; ===============================================================================================================================
|
|---|
| 1622 | Func __ArrayQuickSort1D(ByRef $avArray, ByRef $iStart, ByRef $iEnd)
|
|---|
| 1623 | If $iEnd <= $iStart Then Return
|
|---|
| 1624 | Local $vTmp
|
|---|
| 1625 | ; InsertionSort (faster for smaller segments)
|
|---|
| 1626 | If ($iEnd - $iStart) < 15 Then
|
|---|
| 1627 | Local $vCur
|
|---|
| 1628 | For $i = $iStart + 1 To $iEnd
|
|---|
| 1629 | $vTmp = $avArray[$i]
|
|---|
| 1630 | If IsNumber($vTmp) Then
|
|---|
| 1631 | For $j = $i - 1 To $iStart Step -1
|
|---|
| 1632 | $vCur = $avArray[$j]
|
|---|
| 1633 | ; If $vTmp >= $vCur Then ExitLoop
|
|---|
| 1634 | If ($vTmp >= $vCur And IsNumber($vCur)) Or (Not IsNumber($vCur) And StringCompare($vTmp, $vCur) >= 0) Then ExitLoop
|
|---|
| 1635 | $avArray[$j + 1] = $vCur
|
|---|
| 1636 | Next
|
|---|
| 1637 | Else
|
|---|
| 1638 | For $j = $i - 1 To $iStart Step -1
|
|---|
| 1639 | If (StringCompare($vTmp, $avArray[$j]) >= 0) Then ExitLoop
|
|---|
| 1640 | $avArray[$j + 1] = $avArray[$j]
|
|---|
| 1641 | Next
|
|---|
| 1642 | EndIf
|
|---|
| 1643 | $avArray[$j + 1] = $vTmp
|
|---|
| 1644 | Next
|
|---|
| 1645 | Return
|
|---|
| 1646 | EndIf
|
|---|
| 1647 | ; QuickSort
|
|---|
| 1648 | Local $L = $iStart, $R = $iEnd, $vPivot = $avArray[Int(($iStart + $iEnd) / 2)], $fNum = IsNumber($vPivot)
|
|---|
| 1649 | Do
|
|---|
| 1650 | If $fNum Then
|
|---|
| 1651 | ; While $avArray[$L] < $vPivot
|
|---|
| 1652 | While ($avArray[$L] < $vPivot And IsNumber($avArray[$L])) Or (Not IsNumber($avArray[$L]) And StringCompare($avArray[$L], $vPivot) < 0)
|
|---|
| 1653 | $L += 1
|
|---|
| 1654 | WEnd
|
|---|
| 1655 | ; While $avArray[$R] > $vPivot
|
|---|
| 1656 | While ($avArray[$R] > $vPivot And IsNumber($avArray[$R])) Or (Not IsNumber($avArray[$R]) And StringCompare($avArray[$R], $vPivot) > 0)
|
|---|
| 1657 | $R -= 1
|
|---|
| 1658 | WEnd
|
|---|
| 1659 | Else
|
|---|
| 1660 | While (StringCompare($avArray[$L], $vPivot) < 0)
|
|---|
| 1661 | $L += 1
|
|---|
| 1662 | WEnd
|
|---|
| 1663 | While (StringCompare($avArray[$R], $vPivot) > 0)
|
|---|
| 1664 | $R -= 1
|
|---|
| 1665 | WEnd
|
|---|
| 1666 | EndIf
|
|---|
| 1667 | ; Swap
|
|---|
| 1668 | If $L <= $R Then
|
|---|
| 1669 | $vTmp = $avArray[$L]
|
|---|
| 1670 | $avArray[$L] = $avArray[$R]
|
|---|
| 1671 | $avArray[$R] = $vTmp
|
|---|
| 1672 | $L += 1
|
|---|
| 1673 | $R -= 1
|
|---|
| 1674 | EndIf
|
|---|
| 1675 | Until $L > $R
|
|---|
| 1676 | __ArrayQuickSort1D($avArray, $iStart, $R)
|
|---|
| 1677 | __ArrayQuickSort1D($avArray, $L, $iEnd)
|
|---|
| 1678 | EndFunc ;==>__ArrayQuickSort1D
|
|---|
| 1679 | ; #INTERNAL_USE_ONLY# ===========================================================================================================
|
|---|
| 1680 | ; Name...........: __ArrayQuickSort2D
|
|---|
| 1681 | ; Description ...: Helper function for sorting 2D arrays
|
|---|
| 1682 | ; Syntax.........: __ArrayQuickSort2D(ByRef $avArray, ByRef $iStep, ByRef $iStart, ByRef $iEnd, ByRef $iSubItem, ByRef $iSubMax)
|
|---|
| 1683 | ; Parameters ....: $avArray - Array to sort
|
|---|
| 1684 | ; $iStep - Step size (should be 1 to sort ascending, -1 to sort descending!)
|
|---|
| 1685 | ; $iStart - Index of array to start sorting at
|
|---|
| 1686 | ; $iEnd - Index of array to stop sorting at
|
|---|
| 1687 | ; $iSubItem - Sub-index to sort on in 2D arrays
|
|---|
| 1688 | ; $iSubMax - Maximum sub-index that array has
|
|---|
| 1689 | ; Return values .: None
|
|---|
| 1690 | ; Author ........: Jos van der Zande, LazyCoder, Tylo, Ultima
|
|---|
| 1691 | ; Modified.......:
|
|---|
| 1692 | ; Remarks .......: For Internal Use Only
|
|---|
| 1693 | ; Related .......:
|
|---|
| 1694 | ; Link ..........:
|
|---|
| 1695 | ; Example .......:
|
|---|
| 1696 | ; ===============================================================================================================================
|
|---|
| 1697 | Func __ArrayQuickSort2D(ByRef $avArray, ByRef $iStep, ByRef $iStart, ByRef $iEnd, ByRef $iSubItem, ByRef $iSubMax)
|
|---|
| 1698 | If $iEnd <= $iStart Then Return
|
|---|
| 1699 | ; QuickSort
|
|---|
| 1700 | Local $vTmp, $L = $iStart, $R = $iEnd, $vPivot = $avArray[Int(($iStart + $iEnd) / 2)][$iSubItem], $fNum = IsNumber($vPivot)
|
|---|
| 1701 | Do
|
|---|
| 1702 | If $fNum Then
|
|---|
| 1703 | ; While $avArray[$L][$iSubItem] < $vPivot
|
|---|
| 1704 | While ($iStep * ($avArray[$L][$iSubItem] - $vPivot) < 0 And IsNumber($avArray[$L][$iSubItem])) Or (Not IsNumber($avArray[$L][$iSubItem]) And $iStep * StringCompare($avArray[$L][$iSubItem], $vPivot) < 0)
|
|---|
| 1705 | $L += 1
|
|---|
| 1706 | WEnd
|
|---|
| 1707 | ; While $avArray[$R][$iSubItem] > $vPivot
|
|---|
| 1708 | While ($iStep * ($avArray[$R][$iSubItem] - $vPivot) > 0 And IsNumber($avArray[$R][$iSubItem])) Or (Not IsNumber($avArray[$R][$iSubItem]) And $iStep * StringCompare($avArray[$R][$iSubItem], $vPivot) > 0)
|
|---|
| 1709 | $R -= 1
|
|---|
| 1710 | WEnd
|
|---|
| 1711 | Else
|
|---|
| 1712 | While ($iStep * StringCompare($avArray[$L][$iSubItem], $vPivot) < 0)
|
|---|
| 1713 | $L += 1
|
|---|
| 1714 | WEnd
|
|---|
| 1715 | While ($iStep * StringCompare($avArray[$R][$iSubItem], $vPivot) > 0)
|
|---|
| 1716 | $R -= 1
|
|---|
| 1717 | WEnd
|
|---|
| 1718 | EndIf
|
|---|
| 1719 | ; Swap
|
|---|
| 1720 | If $L <= $R Then
|
|---|
| 1721 | For $i = 0 To $iSubMax
|
|---|
| 1722 | $vTmp = $avArray[$L][$i]
|
|---|
| 1723 | $avArray[$L][$i] = $avArray[$R][$i]
|
|---|
| 1724 | $avArray[$R][$i] = $vTmp
|
|---|
| 1725 | Next
|
|---|
| 1726 | $L += 1
|
|---|
| 1727 | $R -= 1
|
|---|
| 1728 | EndIf
|
|---|
| 1729 | Until $L > $R
|
|---|
| 1730 | __ArrayQuickSort2D($avArray, $iStep, $iStart, $R, $iSubItem, $iSubMax)
|
|---|
| 1731 | __ArrayQuickSort2D($avArray, $iStep, $L, $iEnd, $iSubItem, $iSubMax)
|
|---|
| 1732 | EndFunc ;==>__ArrayQuickSort2D
|
|---|