使用单个数组创建一个锯齿型/多维数组

3

目前我遇到了一个问题,涉及一个脚本,它根据传递给它的一组动态服务器\优先级来构建数组。例如,基于以下输入:

server1,200
server2,200

我想要建立一个类似于

$arr=@() #at this point I have an empty array
$arr+=@("server1",200) #at this point, I would expect to have an array
                       #that itself holds another array

然而,此时运行此代码会得到意外的输出。
echo $arr.count # result is 2, rather than the 1 I would expect
                # It appears to be treating $arr as a single array
                # with two members (server1 and 200) rather than an array
                # that holds an array, which itself has two members

然而,如果我向我的数组中添加另一个空数组:
$arr = @()
$arr += @()
$arr += $("server1",200)
$arr.count # output is 2, which is the desired result

我得到了我想要的结果。我的问题是,我能否只使用一个数组来获得我的期望的不规则/多维数组的结果?这并不是一个常见的情况,因为大多数时候我会处理多组项目,但我想考虑所有情况,这可能是其中之一。我只是希望不必添加额外的步骤来过滤掉空数组以满足这个条件。
任何建议都将不胜感激。
1个回答

4
您的两个示例产生完全相同的结果,即一个由2个元素组成的平坦数组,因为追加一个空数组($arr+=@())不会以任何方式修改数组。
演示:
PS C:\> $arr = @()
PS C:\> $arr += @('server1', 200)
PS C:\> $arr.Count
2
PS C:\> Format-Custom -InputObject $arr
server1
200
PS C:\> $arr = @()
PS C:\> $arr += @()
PS C:\> $arr += @('server1', 200)
PS C:\> $arr.Count
2
PS C:\> Format-Custom -InputObject $arr
server1
200
当您使用附加运算符(+=)与两个数组时,PowerShell基本上连接这两个数组。要将数组作为嵌套元素附加到第一个数组,您需要使用一元数组构造运算符(,)将第二个数组前置。
PS C:\> $arr = @()
PS C:\> $arr += ,@('server1', 200)
PS C:\> $arr += ,@('server2', 200)
PS C:\> $arr.Count
2
PS C:\> Format-Custom -InputObject $arr

[
  server1
  200
]
[ server2 200 ]
如果您事先知道元素数量,还可以预先创建所需大小的数组,并将嵌套数组分配为其元素。这不需要逗号运算符。
PS C:\> $arr = New-Object Object[] 2
PS C:\> $arr.Count
2
PS C:\> $arr[0] = @('server1', 200)
PS C:\> $arr[1] = @('server2', 200)
PS C:\> Format-Custom -InputObject $arr

[
  server1
  200
]
[ server2 200 ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接