-1

I have array like this :

Array (
    [2018-03-12] => Array (
        [United States] => 4
        [Australia] => 15
        [United Kingdom] => 0
        [New Zealand] => 0
    )
    [2018-03-13] => Array (
        [United States] => 0
        [Australia] => 8
        [United Kingdom] => 2
        [New Zealand] => 0
    )
)

I want to make an array like this:

[
    ["2018-03-12", 4, 15, 0, 0],
    ["2018-03-13", 0, 8, 0, 2]
]

How can this be done?

mickmackusa
  • 43,625
  • 12
  • 83
  • 136

2 Answers2

5

Try:

$arr = [
    '2018-03-12' => [
        'United States' => 4,
         'Australia' => 15,
         'United Kingdom' => 0,
         'New Zealand' => 0,
    ],
    '2018-03-13' => [
         'United States' => 0,
         'Australia' => 8,
         'United Kingdom' => 2,
         'New Zealand' => 0,
    ]
];

return array_map(function ($item, $key) {
    return array_merge([$key], array_values($item));
},$arr, array_keys($arr));

Demo https://implode.io/K8yHG0

Song
  • 301
  • 1
  • 2
0

You only need to iterate each top level element, then merge/store the key as an element and the subarray values.

Code: (Demo)

$array = [
    '2018-03-12' => [
         'United States' => 4,
         'Australia' => 15,
         'United Kingdom' => 0,
         'New Zealand' => 0,
    ],
    '2018-03-13' => [
         'United States' => 0,
         'Australia' => 8,
         'United Kingdom' => 2,
         'New Zealand' => 0,
    ]
];

foreach ($array as $key => $subarray) {
        $result[] = array_merge([$key], array_values($subarray));
}
var_export($result);

Output:

array (
  0 => 
  array (
    0 => '2018-03-12',
    1 => 4,
    2 => 15,
    3 => 0,
    4 => 0,
  ),
  1 => 
  array (
    0 => '2018-03-13',
    1 => 0,
    2 => 8,
    3 => 2,
    4 => 0,
  ),
)

Or you can unshift the key into subarray and reindex both levels.

foreach ($array as $key => $subarray) {
    array_unshift($subarray, $key);
    $result[] = array_values($subarray);
}

Or you can use the Union Operator to merge the key with the subarray elements and then reindex.

foreach ($array as $key => $subarray) {
    $result[] = array_values([$key] + $subarray);
}

You can even unpack the subarray into an array_push call if your php version allows variadics.

foreach ($array as $key => $subarray) {
    $temp = [];
    array_push($temp, $key, ...array_values($subarray));
    $result[] = $temp;
}

Or (Demo)

var_export(
    array_map(
        fn($k) => array_merge([$k], array_values($array[$k])),
        array_keys($array)
    )
);
mickmackusa
  • 43,625
  • 12
  • 83
  • 136