* 配列・連想配列 [#ndf26c89]
** 配列の作成 [#k8e0d34d]
*** カンマによる簡単な方法 [#h54120ca]
PS> $nums = 1,2,3
PS> $nums[1]
2
*** @(,)による厳密な方法 (空の配列を作る場合など)[#rdcb44ad]
PS> $texts = @("taro", "jiro", "hanako")
PS> $texts[1]
jiro
PS> $nums = @() # 空の配列
PS> $nums.Count
0
*** 配列の要素の型は不定でよい [#cf1a0649]
PS> $data = 123, "ABC", [datetime]"2020-01-01"
** 配列の中身のダンプ [#mcfc6d1a]
PS> $data = 123, "ABC", [datetime]"2020-01-01"
PS> $data | ConvertTo-Json
[
123,
"ABC",
{
"value": "\/Date(1577804400000)\/",
"DateTime": "2020年1月1日 0:00:00"
}
]
ConvertTo-JSONを使うと変数の中身がわかりやすい。
** 配列の追加・削除など [#wdeeaaa9]
*** push [#wf7586dd]
PS> $nums = 1,2,3
PS> $nums += 4
PS> $nums[3]
4
*** shift [#gf75c247]
PS> $nums = 1,2,3
PS> $first, $rest = $nums
PS> $first
1
PS> $rest
2
3
*** 削除 [#d46ed940]
PS> $nums = 1,2,3
PS> $nums[1] = $null
PS> $nums
1
3
*** 挿入 [#u527bf2e]
PS> [System.Collections.ArrayList]$nums = 1,2,3
PS> $nums.(1,9)
PS> $nums
1
9
2
3
** 多次元配列(ジャグ配列) [#nc56cd86]
PS> $data = ("taro", 15), ("jiro", 10)
PS> $data[1][1]
10
*** 配列に配列を格納する時はカンマ演算子を使う [#df02e56f]
PS>$a = (1,2),(,3)
- 配列の要素に配列を値として格納する場合、先頭にカンマ(,)をつける。そうしないと()で値をくるんでもフラットな値として解釈される。
- 上の例でいえば、(,3)は先頭にカンマをつけてある。(1,2),(3)としてはいけない。
- なぜかというと、以下にJavaSriptのJSONで説明する。
PS> $data = (1,2),(3,4) # この時点で$dataはJSONでいう[[1,2], [3,4]]
PS> $data += , @(5) # 同様にJSONで[[1,2], [3,4], [5]]
PS> $data += @(6) # 先頭にカンマ(,)をつけないと、[[1,2], [3,4], [5], 6]のように値が配列値でなくスカラー値になる
PS> $data[2] -is [array]
True # $data[2]の値は[5]なのでTrue
PS> $data[3] -is [array]
False # $data[3]の値は6なのでFalse
*** 多次元配列をパイプで処理する [#t15c23b1]
PS> ,(1,2,3) | % { $_.GetType() }
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS> (1,2,3) | % { $_.GetType() }
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
True True Int32 System.ValueType
True True Int32 System.ValueType
- 先頭にカンマ演算子を置くことで、配列の配列としてパイプに渡る。GetType()は1回実行される。
- カンマ演算子を置かないと、配列の要素が値として渡る。GetType()が3回実行される。
*** 非ジャグ配列な多次元配列 [#f95e5b58]
PS> $data = New-Object "int32[,]" 2,3 # 2次元配列
PS> $data[0,1] = 100
PS> $data[0,3] = 200 # インデックスが配列の境界外のためエラーになる
PS> $data = New-Object "object[,,]" 2,3,4 # 3次元配列
- 通常はジャグ配列の多次元配列でよいが、高速な処理を行う場合は本当の多次元配列である非ジャグ配列を使う。
- 非ジャグ配列な多次元配列はこのようにNew-Objectで宣言する。
** 参考 [#e75f8355]
- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_arrays
- https://4sysops.com/archives/arrays-in-powershell-create-change-read-sort-delete/