-
Notifications
You must be signed in to change notification settings - Fork 8
/
array_walk_recursive.vbs
51 lines (40 loc) · 1.97 KB
/
array_walk_recursive.vbs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<%
'=======================================================================
'配列の全ての要素に、ユーザー関数を再帰的に適用する
'=======================================================================
'【引数】
' arr = array 入力の配列。
' callback = callback 引数を二つとります。 array パラメータの値が最初の引数、 キー/添字は二番目の引数となります。funcname により配列の値そのものを変更する必要がある場合、 funcname の最初の引数は 参照 として渡す必要があります。この場合、配列の要素に加えた変更は、 配列自体に対して行われます。
' userdata = array userdata パラメータが指定された場合、 コールバック関数 funcname への三番目の引数として渡されます。
'【戻り値】
' 成功した場合に TRUE を返します。
'【処理】
' ・arr の各要素に callback 関数を適用します。
' ・この関数は配列の要素内を再帰的にたどっていきます。
'=======================================================================
Function array_walk_recursive(ByRef arr, callback, userdata)
Dim key
Dim thisCall
If Len( callback ) = 0 Then Exit Function
If isArray( arr ) Then
For key = 0 to uBound( arr )
If isArray(arr(key)) or isObject(arr(key)) Then
thisCall = "array_walk_recursive"
Else
thisCall = callback
End If
execute("call " & callback & "(arr(key),key,userdata)")
Next
ElseIf isObject( arr ) Then
For Each key In arr
If isArray(arr(key)) or isObject(arr(key)) Then
thisCall = "array_walk_recursive"
Else
thisCall = callback
End If
execute("call " & callback & "(arr(key),key,userdata)")
Next
End If
array_walk_recursive = true
End Function
%>