Imho if You want to delete elements by index/id in basic type array (int, float, string) and want to preserve elements position do something like this:
// compile in Debug mode
GLOBAL myarray%[], elems2del%[], i1%, i2%, txt$
DIM myarray%[0]
DIM elems2del%[0]
SEEDRND 1
txt$ = ""
FOR i1 = 0 TO 20
i2 = RND(100)
DIMPUSH myarray[], i2
INC txt$, i2 + ", "
NEXT
txt$ = LEFT$(txt$, LEN(txt$) - 2)
DEBUG txt$ + "\n"
DIMDATA elems2del[], 7, 14, 9 // or use DimPush
SORTARRAY elems2del[], 0 // ascending order
FOR i1 = LEN(elems2del[]) - 1 TO 0 STEP -1
DIMDEL myarray[], elems2del[i1]
NEXT
txt$ = ""
FOR i1 = 0 TO LEN(myarray[]) - 1
INC txt$, myarray[i1] + ", "
NEXT
txt$ = LEFT$(txt$, LEN(txt$) - 2)
DEBUG txt$ + "\n"
END
For dealing with UDT's I use 'toDelete%' flag, or approach similar to this, separate array with indexes to delete - depending on game logic, and if I don't need to preserve elements order just do elem[del_id] = elem[len[elem]-1], dec elem_count -> as this should be faster than multiple dimdel/push on large arrays.