• Offizieller Beitrag

    Wieso hatte ich eigentlich das noch nicht gemacht? :D

    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
    [autoit]

    #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'

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

    $ar2[1][0] = 'Peter'
    $ar2[1][1] = 'Paul'
    $ar2[1][2] = 'Fred'

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

    $ar2[2][0] = 'Peter'
    $ar2[2][1] = 'Fred'
    $ar2[2][2] = 'Anna'

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

    $ar2[3][0] = 'Annalene'
    $ar2[3][1] = 'Manfred'
    $ar2[3][2] = 'Pauline'

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

    $ar2[4][0] = 'Marianna'
    $ar2[4][1] = 'Otto'
    $ar2[4][2] = 'Annafred'

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

    $ar2[5][0] = 'Ottone'
    $ar2[5][1] = 'Marie'
    $ar2[5][2] = 'Klaus'

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

    _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")

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

    ;----------------------------------------------------------------------------------------------------------------------
    ;
    ; 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

    [/autoit]
  • ehm...okay bei den rückgabewerten steig ich noch nicht durch..es scheint aber zu funktionieren^^
    ich glaub ich sollte noch weiter 15 stunden damit verbringen dass zu verstehen um einen angemessenden kommentar abzugeben^^
    trotzdem gut gemacht :)


    snoozer

  • sehr gut bugfix - ich heut genau danach gesucht und inna hilfe nur arrarserach für ein 1dim array gefunden thx
    perfektes timing