'Implode columnar values between two arrays into a flat array of concatenated strings

I have two arrays, $array_A and $array_B. I'd like to append the first value from $array_B to the end of the first value of $array_A and repeat this approach for all elements in both arrays.

$array_A = ['foo', 'bar', 'quuz'];
$array_B = ['baz', 'qux', 'corge'];

Expected output after squishing:

['foobaz', 'barqux', 'quuzcorge']

array_merge($array_A, $array_B) simply appends array B onto array A, and array_combine($array_A, $array_B) sets array A to be the key for array B, neither of which I want. array_map seems pretty close to what I want, but seems to always add a space between the two, which I don't want.

It would be ideal for the lengths of each array it to be irrelevant (e.g. array A has five entries, array B has seven entries, extra entries are ignored/trimmed) but not required.



Solution 1:[1]

// updated version
$a = ['a', 'b', 'c'];
$b = ['d', 'e', 'f', 'g']; 
print_r(array_map('implode', array_map(null, $a, $b)));

Solution 2:[2]

Probably the fastest code, but more verbose than other options.

//updated version
$array_A = ['foo', 'bar', 'quuz'];
$array_B = ['baz', 'qux', 'corge'];

for ($i = 0, $c = count($array_A); $i<$c; $i++) {
    $result[$i] = $array_A[$i].$array_B[$i];
}

var_dump($result);

Solution 3:[3]

There isn't an array function in PHP that does exactly that. However, you can write one yourself, like this one:

function array_zip($a1, $a2) {
  $out = [];
  for($i = 0; $i < min(sizeof($a1), sizeof($a2)); $i++) {
    array_push($out, $a1[$i] .  $a2[$i]);
  }
  return $out;
}

So given these arrays and running it:

$a = ["foo", "bar"];
$b = ["baz", "qux"];
print_r(array_zip($a, $b));

You would get:

Array
(
    [0] => foobaz
    [1] => barqux
)

Solution 4:[4]

Try this:

$A = ['foo', 'bar'];
$B = ['baz', 'qux'];

function arraySquish($array) 
{
  $new = [''];
  foreach($array as $val) {
    $new[0] .= $val;
  }

  return $new;
}

$A = arraySquish($A);
$B = arraySquish($B);

echo '<pre>';
print_r($A);
print_r($B);
echo '</pre>';

PHP Fiddle here.

Solution 5:[5]

An explicit array_map:

<?php

$colours  = ['red', 'white', 'blue'];
$items    = ['robin', 'cloud', 'mountain']; 

$squished =
    array_map(
        function($colour, $item) {
            return $colour.$item;
        },
        $colours,
        $items
    );

var_export($squished);

Output:

array (
    0 => 'redrobin',
    1 => 'whitecloud',
    2 => 'bluemountain',
  )

If you want to only go as far as the smallest array, you could either return null if either entries are null, and then filter your result.

Or truncate the arrays to the same length:

$b = array_intersect_key($b, $a);
$a = array_intersect_key($a, $b);

Solution 6:[6]

Regardless of if both arrays have the same length or if one is longer than the other or in what order the arrays occur in, the following technique will "squish" the values into a flat array of strings.

array_map() only needs to be called once and implode()'s default "glue" string is an empty string -- so it can be omitted.

Code: (Demo)

$a = ['a', 'b', 'c'];
$b = ['d', 'e', 'f', 'g']; 
var_export(array_map(fn() => implode(func_get_args()), $a, $b));

Or consolidate the column data with spread operator: (Demo)

var_export(array_map(fn(...$column) => implode($column), $a, $b));

Output:

array (
  0 => 'ad',
  1 => 'be',
  2 => 'cf',
  3 => 'g',
)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2
Solution 3 Alexander van Oostenrijk
Solution 4 AlexioVay
Solution 5
Solution 6