1

I need to concatenate each value of an array to every other value in another array in PHP. For example:

$arr1 = ['A', 'B'];
$arr2 = ['CDE', 'F'];
$result = $arr1 * $arr2;
// $result = ['ACDE', 'AF', 'BCDE', 'BF'];

I can implement it by using nested foreach but is there any inbuilt or quicker way to achieve this? As far as I've searched, I could find only array_map which concatenates only same indexes.

DhiwaTdG
  • 748
  • 1
  • 10
  • 26

3 Answers3

2

Frankly, I think that in this case an old-fashioned foreach can be the better solution, but — if you want array_map — this is an array_map only solution (exploded for clarity):

$arr1 = ['A', 'B'];
$arr2 = ['CDE', 'F'];

$result = array();

array_map
(
    function( $row ) use( $arr2, &$result )
    {
        array_map
        (
            function( $row2 ) use( $row, &$result )
            {
                $result[] = "$row$row2";
            }, $arr2
        );
    }, $arr1
);

print_r( $result );

eval.in demo

The result is:

Array
(
    [0] => ACDE
    [1] => AF
    [2] => BCDE
    [3] => BF
)

In fact, this is a “fake” array map, because we don't use returned values, but we add elements to a new array.

You can obtain same result using array_walk with inverted arguments.

fusion3k
  • 11,568
  • 4
  • 25
  • 47
1

You can make use of the array_map() and a anonymous function passing the second array like this with a use

$arr1 = ['A', 'B'];
$arr2 = ['CDE', 'F'];

array_map(function($a1) use ($arr2) {
        foreach ( $arr2 as $a2 )
            echo $a1 . $a2 . PHP_EOL;
        }
    , $arr1
);

The result being

ACDE
AF
BCDE
BF

Its a bit of a brain teaser, so you may have to look up anonymous functions.

http://php.net/manual/en/functions.anonymous.php

RiggsFolly
  • 93,638
  • 21
  • 103
  • 149
0

or if you like really twisted code without use of closures:

function array_product_concat($arr1, $arr2) {
    $arr1c = array_chunk($arr1, 1);
    $arr2c = array_chunk($arr2, 1);
    $arr1cm = array_fill(0, count($arr2), $arr1c);
    $arr1cmc = call_user_func_array('array_map', array_merge(array(null), $arr1cm));
    $arr2cm = array_fill(0, count($arr1), $arr2c);

    $arr1cmcm = call_user_func_array('array_merge', $arr1cmc);
    $arr2cmm = call_user_func_array('array_merge', $arr2cm);
    $arr1cmcmm = call_user_func_array('array_merge', $arr1cmcm);
    $arr2cmmm = call_user_func_array('array_merge', $arr2cmm);
    $result = array_map(null, $arr1cmcmm, $arr2cmmm);
    return array_map('implode', $result);
}
$arr1 = ['A', 'B'];
$arr2 = ['CDE', 'F'];
print_r(array_product_concat($arr1, $arr2));
useless
  • 1,876
  • 17
  • 18