_ArrayDelete() in Schleife

  • Hallo, ich hab folgendes Problem...
    Ich lese aus einer Datei, in ein Array...
    Nun möchte ich nach einem definiertem Filter, Elemente des Arrays löschen und das in einer Schleife

    Ich hab mir das so gedacht:


    [autoit]

    Global $filter[3]=["a","b","c"]

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

    For $i = 0 To UBound($Array)-1
    For $f = 0 To UBound($filter)-1
    If($Array[$i]==$filter[$f]) Then
    _ArrayDelete($Array,$i)
    ExitLoop
    Endif
    Next
    Next

    [/autoit]

    Das ganze funktioniert aber nicht... -.-

    Jemand ne Idee!?

    EDIT:
    Versuch 2:
    Leider auch ERROR...

    [autoit]

    Global $filter[3] = ["a","b","c"]
    For $t = 0 To Ubound($Array)-1
    For $f = 0 To UBound($filter) - 1
    If (StringInStr($Array[$t], $filter[$f]) > 0) Then
    _ArrayDelete($Array, $t)
    ExitLoop
    EndIf
    Next
    Next

    [/autoit]

    http://translation.autoit.de/onlinehilfe/keywords.htm

    4 Mal editiert, zuletzt von aj1987 (6. Juni 2012 um 16:53)

  • Ich Horts hab nur das Beispiel jetzt falsch geschieben -.-
    Nun edited...

    Das Problem ist ja, dass das Array kleiner wird, und somit der Index überschritten wird... weil das ganze in der Schleife total vermurxt...

    Ubound($Array)-1 liefert zwar den richtigen Wert, aber $i wird ja trotzdem +1 was 1. dazu führt das im Array iwann der falsche Index angesprochen wird und 2. der Index überschritten wird...
    Lässt sich das iwie fixen?

  • Mit dem gezeigten Script würdest du aus dem Array nur Einträge löschen, die "a", "b" oder "c" sind. Jedoch kein "A", "Beispiel" oder "cafu".

    Da dein Script aber nicht vollständig ist und deine Erklärung für den Aaa' ist, kann man nur raten, was genau du eigentlich erreichen willst.
    Ich glaube aber, dass du die Funktion StringInStr brauchst (da du eben vom Filter sprichst)...

  • OK...
    also würd ich das so realisieren:

    [autoit]


    Global $filter[3] = ["a","b","c"]
    For $t = 0 To Ubound($Array)-1
    For $f = 0 To UBound($filter) - 1
    If (StringInStr($Array[$t], $filter[$f]) > 0) Then
    _ArrayDelete($Array, $t)
    ExitLoop
    EndIf
    Next
    Next

    [/autoit]

    Funzt aber auch nicht ohne ERROR.

  • [autoit]


    #include <Array.au3>

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

    Global $asArray1[3] = ["a","b","c"]
    Global $asArray2[3] = ["c","d","f"]

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

    For $iCntArray1 = 0 To UBound($asArray1) - 1
    ;~ ConsoleWrite("Debugging $iCntArray1: " & $iCntArray1 & @CRLF)
    For $iCntArray2 = 0 To UBound($asArray2) - 1
    ;~ ConsoleWrite(@TAB & "Debugging $iCntArray2: " & $iCntArray2 & @CRLF)
    If $asArray1[$iCntArray1]==$asArray2[$iCntArray2] Then
    _ArrayDelete($asArray1,$iCntArray1)
    ExitLoop
    Endif
    Next
    Next
    _ArrayDisplay($asArray1)
    _ArrayDisplay($asArray2)

    [/autoit]

    Müsste funktionieren, allerdings hat BugFix recht.^^

    lg chess

    Edit:

    [autoit]


    #include <Array.au3>

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

    Global $asArray1[3] = ["a","b","c"]
    Global $asArray2[3] = ["c","d","f"]

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

    For $iCntArray1 = UBound($asArray1) - 1 To 0 Step -1
    ;~ ConsoleWrite("Debugging $iCntArray1: " & $iCntArray1 & @CRLF)
    For $iCntArray2 = UBound($asArray2) - 1 To 0 Step -1
    ;~ ConsoleWrite(@TAB & "Debugging $iCntArray2: " & $iCntArray2 & @CRLF)
    If $asArray1[$iCntArray1]==$asArray2[$iCntArray2] Then
    _ArrayDelete($asArray1,$iCntArray1)
    ;ExitLoop
    Endif
    Next
    Next
    _ArrayDisplay($asArray1)
    _ArrayDisplay($asArray2)

    [/autoit]
  • Mal ein kleiner Tip:
    Rückwärts löschen. Dann klappt es auch mit dem Index. ;)

    Interessanter Tipp, Danke!
    Werd ich sofort mal probieren!

    EDIT:
    Das Funktioniert! :D
    DANKE!!!