- Offizieller Beitrag
Hi,
und wieder was für meine Array-UDF-Sammlung
Im Hilfe-Forum war letztens das Thema Array splitten aktuell.
Das habe ich zum Anlaß genommen und eine Splitfunktion erstellt.
_Array2DSplit(ByRef $AR_SOURCE, ByRef $AR_TARGET, $iFROM=-1 [, $ANZ=-1])
Die Variable für Ziel-Array muß auch als Array deklariert werden. Die Anzahl der Elemente spielt keine Rolle, die Größe wird innerhalb der Funktion angepaßt.
- arbeitet mit 1D und 2D Arrays
- Anzahl der Elemente in 2.ter Dimension beliebig
- splittet ein Quell-Array ($AR_SOURCE) ab Array-Index ($iFROM)
- Einträge vor Split-Index verbleiben im Quell-Array
- Einträge ab Split-Index werden im Ziel-Array ($AR_TARGET) ausgegeben
optional
- es kann eine Anzahl ($ANZ) von Elementen ab Split-Index in das Ziel-Array ausgelagert werden
- alle anderen Einträge verbleiben im Quell-Array
Edit: Bugfix in der Fehlerroutine bei zu großem Wert für $ANZ
Spoiler anzeigen
;*******************************************************************************************************
; Funktion _Array2DSplit(ByRef $AR_SOURCE, ByRef $AR_TARGET, $iFROM=-1 [, $ANZ=-1])
;
; Beschreibung Splittet ein 1D/2D Array ab Indexposition, optional wird Anzahl Einträge ausgelagert
;
; Parameter $AR_SOURCE Array mit Ausgangsdaten
; $AR_TARGET Array mit abgesplitteten Daten
; $iFROM Index ab dem gesplittet wird
; optional $ANZ Anzahl Elemente, die abgesplittet werden sollen
;
; Rückgabe Erfolg -1
; Fehler 0 @error = 1 Ausgangsvariablen sind keine Arrays
; @error = 2 kein Startindex oder Index außerhalb Bereich
;
; Autor BugFix ([email='bugfix@autoit.de'][/email])
;*******************************************************************************************************
Func _Array2DSplit(ByRef $AR_SOURCE, ByRef $AR_TARGET, $iFROM=-1, $ANZ=-1)
If ( Not IsArray($AR_SOURCE) ) Or ( Not IsArray($AR_TARGET) ) Then
SetError(1)
Return 0
EndIf
If $ANZ = -1 Then $ANZ = UBound($AR_SOURCE)-$iFROM
If ( $iFROM < 0 ) Or ( $iFROM > UBound($AR_SOURCE)-1 ) Or ( $ANZ < 1 ) Or ( $ANZ > (UBound($AR_SOURCE)-$iFROM) ) Then
SetError(2)
Return 0
EndIf
Local $UBound2nd = UBound($AR_SOURCE,2)
If @error = 2 Then
Local $arTMP[1]
ReDim $AR_TARGET[$ANZ]
ReDim $arTMP[UBound($AR_SOURCE)-$ANZ]
For $k = 0 To $iFROM-1
$arTMP[$k] = $AR_SOURCE[$k]
Next
$j = 0
For $i = $iFROM To $iFROM+$ANZ-1
$AR_TARGET[$j] = $AR_SOURCE[$i]
$j += 1
Next
For $i = $iFROM+$ANZ To UBound($AR_SOURCE)-1
$arTMP[$k] = $AR_SOURCE[$i]
$k +=1
Next
$AR_SOURCE = $arTMP
Return -1
Else
Local $arTMP[1][$UBound2nd]
ReDim $AR_TARGET[$ANZ][$UBound2nd]
ReDim $arTMP[UBound($AR_SOURCE)-$ANZ][$UBound2nd]
For $k = 0 To $iFROM-1
For $i = 0 To $UBound2nd-1
$arTMP[$k][$i] = $AR_SOURCE[$k][$i]
Next
Next
$j = 0
For $i = $iFROM To $iFROM+$ANZ-1
For $l = 0 To $UBound2nd-1
$AR_TARGET[$j][$l] = $AR_SOURCE[$i][$l]
Next
$j += 1
Next
For $i = $iFROM+$ANZ To UBound($AR_SOURCE)-1
For $l = 0 To $UBound2nd-1
$arTMP[$k][$l] = $AR_SOURCE[$i][$l]
Next
$k +=1
Next
$AR_SOURCE = $arTMP
Return -1
EndIf
EndFunc ;==>_Array2DSplit