Search code examples
phparraystranspose

Combine and transpose three arrays with associative keys


I have three arrays for instance

Array1
array (size=3)
0 => string 'a' (length=1)
1 => string 'b' (length=1)
2 => string 'c' (length=1)

Array2
array (size 3)
0 => string '$' (length=1)
1 => string '%' (length=1)
2 => string '^' (length=1)

Array3
array (size 3)
0 => int '1' (length=1)
1 => int '2' (length=1)
2 => int '3' (length=1)

I want an array4 to be have this configuration that each array's each row should be one group. For instance

Array4
0th 
name=a
type=$
price=1

1st
name=b
type=%
price=2

2nd
name=c
type=^
price=3

I tried this and gave me perfect result

$output = array_combine($array1, $array2);

But when I tried this it wouldn't give expected result

$output = array_combine(array_combine($array, $array2),$array3);

Solution

  • utilizing functional helpers

    By using array_map and array_combine, you can skip having to handle things like counts, iterators, manual array assignment, and manual array combining.

    This solution reduces complexity by using procedures which hide all that complexity behind useful, functional APIs.

    $names = ['a', 'b', 'c'];
    $types = ['$', '%', '^'];
    $prices = [1, 2, 3];
    
    $result = array_map(function ($name, $type, $price) {
      return array_combine(
        ['name', 'type', 'price'],
        [$name, $type, $price]
      );
    }, $names, $types, $prices);
    
    echo json_encode($result, JSON_PRETTY_PRINT);
    

    Output (some line-breaks removed for brevity)

    [
      {"name": "a", "type": "$", "price": 1},
      {"name": "b", "type": "%", "price": 2},
      {"name": "c", "type": "^", "price": 3}
    ]
    

    hiding your own complexity

    You can even abstract away your own complexity by defining your own procedure, array_zip_combine — which works like array_combine but accepts multiple input arrays which are first "zipped" before being combined

    this solution requires PHP 7+

    // PHP 7 offers rest parameter and splat operator to easily apply variadic function
    function array_zip_combine (array $keys, ...$arrs) {
      return array_map(function (...$values) use ($keys) {
        return array_combine($keys, $values);
      }, ...$arrs);
    }
    
    $result = array_zip_combine(['name', 'type', 'price'], $names, $types, $prices);
    

    same solution for PHP 5.4+

    // PHP 5 doesn't offer splat operator so we have to use
    // call_user_func_array to apply a variadic function
    function array_zip_combine (array $keys /* args */) {
      $f = function () use ($keys) { return array_combine($keys, func_get_args()); };
      return call_user_func_array(
        'array_map',
        array_merge([$f], array_slice(func_get_args(), 1))
      );
    }
    
    $result = array_zip_combine(['name', 'type', 'price'], $names, $types, $prices);