Powershell - 连接嵌套的字符串数组

问题描述

假设我有一个数组:

   0  1
a  2  0
b  0  2
c  1  2
d  1  0
e  0  0
f  0  0

为了得到一个连接的字符串,我做这样的事情:

import shutil
import urllib.parse
import urllib.request
import os

urls = {
    'just_filename' : 'https://github.com/bits4waves/100daysofpractice-dataset/raw/master/requirements.txt','filename_with_params' : 'https://github.com/bits4waves/resonometer/blob/master/sound/violin-A-pluck.wav?raw=true','no_filename' : 'https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=en-US',}

for url in urls.values():
    with urllib.request.urlopen(url) as response:
        parsed_url_path = urllib.parse.urlparse(response.url).path
        filename = os.path.basename(parsed_url_path)
        with open(filename,'w+b') as f:
            shutil.copyfileobj(response,f)

会导致

$stringArray = @('a','b','c')

如果我有的话,我需要做什么(以一种干净有效的方式)

$stringArray -join ','

我想得到

a,b,c

???

更新:我当前的脚本是这样的:

$stringArray = @(@('a1','a2','a3'),'c')

但是这个锯齿状数组的维度是硬编码的(即它只适用于数组数组,而不适用于数组数组)。有什么更优雅、更灵活的吗?

解决方法

您需要的是一个递归辅助函数来展平数组。

像这样:

function Flatten-Array([array]$a) {
    $a | ForEach-Object {
        if ($_ -is [array]) { Array-Flatten $_ } else {$_ }
    }
}

用法:

$stringArray = @(@('a1','a2','a3'),'b','c')
$flatArray = Flatten-Array $stringArray
$flatArray -join ','  # --> a1,a2,a3,b,c

或者使用更深的嵌套数组:

$stringArray = @('X','Y','Z',@(@('a1','a3',@(3,4,5)),'c'))
$flatArray = Flatten-Array $stringArray
$flatArray -join ','  # --> X,Y,Z,a1,3,5,c