- Offizieller Beitrag
Wieso hatte ich eigentlich das noch nicht gemacht?
Nun gut, hier also die Suchfunktion für 1D/2D-Arrays.
- Es werden alle Vorkommen eines Suchbegriffs gesucht.
- Rückgabe des FundIndex in einem Array, bei 2D: [IndexZeile | IndexSpalte]
- Array[0] enthält die Anzahl der Treffer
- wird nichts gefunden ist Array[0] = 0
- Suche im ganzen Array oder von StartIndex bis EndIndex
- Suche in allen Spalten oder nur in SpaltenIndex
- Suche case sensitive möglich
- Teilstringsuche möglich
- Alle numerischen Parameter können mit -1 auf Standard gesetzt werden
Edit:
- zusätzlicher Parameter $1stFound, durchsucht Array nur bis zum ersten Treffer
(Ich hatte noch die Variante: case sensitive + Teilsuche vergessen. Jetzt ists aber komplett.)
EDIT:
Um es nochmal deutlich zu machen - im Gegensatz zur bekannten Funktion _ArraySearch() für 1D wird nicht auf das erste Vorkommen des Suchbegriffs überprüft und dieser dann zurückgegeben, sondern es wird nach allen Vorkommen im Array gesucht und dann der PositionsIndex der Fundstelle(n) zurückgegeben.
Bei sehr großen 2D Arrays bringt das zwar etwas Geschwindigkeitseinbuße, aber mit der qualitativ besseren Suche wird das m.E. wettgemacht.
Hier zum Probieren:
Nicht wundern bei der Ausgabe - ArrayDisplay macht aus '|' ein '~'
Spoiler anzeigen
#include <array.au3>
Dim $ar[6]=['otto','Paul','Manfred','Fred','Annafred','Pauline']
Dim $ar2[6][3]
$ar2[0][0] = 'Otto'
$ar2[0][1] = 'Fred'
$ar2[0][2] = 'Peter'
$ar2[1][0] = 'Peter'
$ar2[1][1] = 'Paul'
$ar2[1][2] = 'Fred'
$ar2[2][0] = 'Peter'
$ar2[2][1] = 'Fred'
$ar2[2][2] = 'Anna'
$ar2[3][0] = 'Annalene'
$ar2[3][1] = 'Manfred'
$ar2[3][2] = 'Pauline'
$ar2[4][0] = 'Marianna'
$ar2[4][1] = 'Otto'
$ar2[4][2] = 'Annafred'
$ar2[5][0] = 'Ottone'
$ar2[5][1] = 'Marie'
$ar2[5][2] = 'Klaus'
_ArrayDisplay($ar, "Suchbegriff: fred")
_ArrayDisplay(_Array2DSearch($ar, 'fred',-1,0,0,0,True), "1D - Teilsuche / kein CaseSense")
_ArrayDisplay($ar2, "Suchbegriff: fred")
_ArrayDisplay(_Array2DSearch($ar2, 'fred',-1,0,0,0,True), "2D - Teilsuche / kein CaseSense")
;----------------------------------------------------------------------------------------------------------------------
;
; Function _Array2DSearch($avArray, $vWhat2Find [, $iDim=-1 [, $iStart=0 [, $iEnd=0 [, $iCaseSense=0 [, $fPartialSearch=False [, $1stFound=False]]]]]])
;
; Description Finds all Entry's like $vWhat2Find in an 1D/2D Array
; Works with all occurences in 2nd Dimension
; Search in all occurences or only in a given column
; To set numeric values for default, you can use -1
;
; Parameter $avArray The array to search
; $vWhat2Find What to search $avArray for
; optional $iDim Index of Dimension to search; default -1 (all)
; optional $iStart Start array index for search; default 0
; optional $iEnd End array index for search; default 0
; optional $iCaseSense If set to 1 then search is case sensitive; default 0
; optional $fPartialSearch If set to True then executes a partial search. default False
; optional $1stFound If set to True, only one match will be searched; default False
;
; Return Succes Array with Index of matches, Array[0] includes the count of matches
; In an 2D Array you got for every match [iRow|iCol]
; Array[0] = 0 if no element found
; If option 1stFound is set, Array[0] = FoundIndex; if no element found Array[0] = -1
; Failure 0 and set @error
; @error = 1 given array is not array
; @error = 2 given dim is out of range
; @error = 4 $iStart is out of range
; @error = 8 $iEnd is out of range
;
; Author BugFix ([email='bugfix@autoit.de'][/email])
;----------------------------------------------------------------------------------------------------------------------
Func _Array2DSearch($avArray, $vWhat2Find, $iDim=-1, $iStart=0, $iEnd=0, $iCaseSense=0, $fPartialSearch=False, $1stFound=False)
Local $error = 0, $1D, $arFound[1]=[0]
If $1stFound Then $arFound[0] = -1
If ( Not IsArray($avArray) ) Then
SetError(1)
Return 0
EndIf
Local $UBound2nd = UBound($avArray,2)
If @error = 2 Then $1D = True
If ( $iEnd = 0 ) Or ( $iEnd = -1 ) Then $iEnd = UBound($avArray)-1
If $iStart = -1 Then $iStart = 0
If $iCaseSense = -1 Then $iCaseSense = 0
If $iCaseSense <> 0 Then $iCaseSense = 1
Select
Case ( $iDim > $UBound2nd ) Or ( $iDim < -1 )
$error += 2
Case ( $iStart < 0 ) Or ( $iStart > UBound($avArray)-1 )
$error += 4
Case ( $iEnd < $iStart ) Or ( $iEnd > UBound($avArray)-1 )
$error += 8
EndSelect
If $error <> 0 Then
SetError($error)
Return 0
EndIf
If $fPartialSearch <> True Then $fPartialSearch = False
If $1D Then
For $i = $iStart To $iEnd
Select
Case $iCaseSense = 0 And (Not $fPartialSearch)
If $avArray[$i] = $vWhat2Find Then
If $1stFound Then
$arFound[0] = $i
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i
$arFound[0] += 1
EndIf
EndIf
Case $iCaseSense = 1 And (Not $fPartialSearch)
If $avArray[$i] == $vWhat2Find Then
If $1stFound Then
$arFound[0] = $i
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i
$arFound[0] += 1
EndIf
EndIf
Case $iCaseSense = 0 And $fPartialSearch
If StringInStr($avArray[$i], $vWhat2Find) Then
If $1stFound Then
$arFound[0] = $i
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i
$arFound[0] += 1
EndIf
EndIf
Case $iCaseSense = 1 And $fPartialSearch
If StringInStr($avArray[$i], $vWhat2Find, 1) Then
If $1stFound Then
$arFound[0] = $i
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i
$arFound[0] += 1
EndIf
EndIf
EndSelect
Next
Else
For $i = $iStart To $iEnd
If $iDim = -1 Then
Select
Case $iCaseSense = 0 And (Not $fPartialSearch)
For $k = 0 To $UBound2nd-1
If $avArray[$i][$k] = $vWhat2Find Then
If $1stFound Then
$arFound[0] = $i & '|' & $k
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i & '|' & $k
$arFound[0] += 1
EndIf
EndIf
Next
Case $iCaseSense = 1 And (Not $fPartialSearch)
For $k = 0 To $UBound2nd-1
If $avArray[$i][$k] == $vWhat2Find Then
If $1stFound Then
$arFound[0] = $i & '|' & $k
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i & '|' & $k
$arFound[0] += 1
EndIf
EndIf
Next
Case $iCaseSense = 0 And $fPartialSearch
For $k = 0 To $UBound2nd-1
If StringInStr($avArray[$i][$k], $vWhat2Find) Then
If $1stFound Then
$arFound[0] = $i & '|' & $k
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i & '|' & $k
$arFound[0] += 1
EndIf
EndIf
Next
Case $iCaseSense = 1 And $fPartialSearch
For $k = 0 To $UBound2nd-1
If StringInStr($avArray[$i][$k], $vWhat2Find, 1) Then
If $1stFound Then
$arFound[0] = $i & '|' & $k
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i & '|' & $k
$arFound[0] += 1
EndIf
EndIf
Next
EndSelect
Else
Select
Case $iCaseSense = 0 And (Not $fPartialSearch)
If $avArray[$i][$iDim] = $vWhat2Find Then
If $1stFound Then
$arFound[0] = $i & '|' & $iDim
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i & '|' & $iDim
$arFound[0] += 1
EndIf
EndIf
Case $iCaseSense = 1 And (Not $fPartialSearch)
If $avArray[$i][$iDim] == $vWhat2Find Then
If $1stFound Then
$arFound[0] = $i & '|' & $iDim
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i & '|' & $iDim
$arFound[0] += 1
EndIf
EndIf
Case $iCaseSense = 0 And $fPartialSearch
If StringInStr($avArray[$i][$iDim], $vWhat2Find) Then
If $1stFound Then
$arFound[0] = $i & '|' & $iDim
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i & '|' & $iDim
$arFound[0] += 1
EndIf
EndIf
Case $iCaseSense = 1 And $fPartialSearch
If StringInStr($avArray[$i][$iDim], $vWhat2Find, 1) Then
If $1stFound Then
$arFound[0] = $i & '|' & $iDim
Return $arFound
Else
ReDim $arFound[UBound($arFound)+1]
$arFound[UBound($arFound)-1] = $i & '|' & $iDim
$arFound[0] += 1
EndIf
EndIf
EndSelect
EndIf
Next
EndIf
Return $arFound
EndFunc ;==>_Array2DSearch