arrayspowershellcross-product

Powershell join array values


I'm looking to cross combine values of arrays to create new array. example,

$a = @('Blue','red','green') 
$b = @('car', 'bike') 

to something like

('blue car','red car','green car') and ('blue bike','red bike','green bike')

PS: this is not simple concatenate function I'm looking.

Thanks, Nilay


Solution

  • $a = @('Blue', 'red', 'green') 
    $b = @('car', 'bike') 
    
    $outArrays = @(), @() # Initialize a 2-element array.
    $i = 0
    foreach ($elB in $b) {
      $outArrays[$i++] = foreach ($elA in $a) { "$elA $elB" }
    }
    

    The above takes advantage of PowerShell's ability to use loop statements such as foreach as expressions, with PowerShell implicitly collecting all outputs from the loop in an array ([object[]]; assuming two or more outputs).


    General information about array concatentation:

    To create a flat array, by concatenation, simply use +:

    # Creates a flat array with 5 elements:
    #   @('Blue', 'red', 'green', 'car', 'bike')
    $a + $b
    

    To create a two-element nested array, use the unary form of ,, the array constructor operator:

    # -> Nested 2-element array:
    # * Element 0 contains @('Blue', 'red', 'green')
    # * Element 1 contains: @('car', 'bike')
    , $a + , $b
    

    As an aside: note that you don't strictly need @(...), the array-subexpression operator to create array literals; e.g.,
    $a = 'Blue', 'red', 'green' will do.