PHP Laravel 5.5 collections flatten and keep the integer keys?

GTMeteor picture GTMeteor · Dec 11, 2017 · Viewed 9.2k times · Source

I have the following array :

$array = [
    '2' => ['3' => ['56' => '2'], '6' => ['48' => '2']],
    '4' => ['4' => ['433' => '2', '140' => '2'], '8' => ['421' => '2', '140' => '2']],
    '5' => ['5' => ['88' => '4', '87' => '2']]
];

The following code (flattening) should return it by preserving keys, but it doesnt?

collect($array)->flatten(1);

should give me

[
    '3' => ['56' => '2'],
    '6' => ['48' => '2'],
    '4' => ['433' => '2', '140' => '2'],
    '8' => ['421' => '2', '140' => '2'],
    '5' => ['88' => '4', '87' => '2']
]

However it loses the keys, and just gives array results :/ Am I using it wrong? How should I flatten and preserve keys?

Answer

bmagg picture bmagg · Apr 5, 2018

An elegant solution is to use the mapWithKeys method. This will flatten your array and keep the keys:

collect($array)->mapWithKeys(function($a) {
    return $a;
});

The mapWithKeys method iterates through the collection and passes each value to the given callback. The callback should return an associative array containing a single key / value pair