Group multi array by key and value PHP

Solution:

Because number of items in 2 sub-arrays is always equal, you can use a for loop like this:

$array = [
  0 => [
    0 => [
      'url' => 'https://domain.com.vn',
      'value' => 'Keyword B3'
    ],
    1 => [
      'url' => 'https://domain.com.vn',
      'value' => '[IMAGES 1]'
    ]
  ],
  1 => [
    0 => [
      'url' => 'https://domain-4.com.vn',
      'value' => 'D1'
    ],
    1 => [
      'url' => 'https://domain-4.com.vn',
      'value' => 'E3'
    ]
  ]
];

$result = [];
for ($i = 0 ; $i < count($array[0]); $i++) {
  $result[] = [
    'url' => [$array[0][$i]['url'], $array[1][$i]['url']],
    'value' => [$array[0][$i]['value'], $array[1][$i]['value']],
  ];
}

print_r($result);

Result:

Array
(
    [0] => Array
        (
            [url] => Array
                (
                    [0] => https://domain.com.vn
                    [1] => https://domain-4.com.vn
                )

            [value] => Array
                (
                    [0] => Keyword B3
                    [1] => D1
                )

        )

    [1] => Array
        (
            [url] => Array
                (
                    [0] => https://domain.com.vn
                    [1] => https://domain-4.com.vn
                )

            [value] => Array
                (
                    [0] => [IMAGES 1]
                    [1] => E3
                )

        )

)

Answer

Solution:

For a dynamic solution, you will need to iterate the first level of the array, then combine the first deep subarray's keys with the return value of array_map()'s special transposing behavior with null and the spread operator.

It sure is a bunch of voodoo, but it is dynamic.

Code: (Demo) (Demo showing different length first level data sets)

var_export(
    array_map(
        function ($subarray) {
            return array_combine(
                array_keys($subarray[0]),
                array_map(null, ...array_values($subarray))
            );
        },
        $array
    )
);

See other other phptranspose tagged Stack Overflow pages to see other usages of the transposing technique.

Source