Search code examples
phplaravelflattencollect

PHP Laravel 5.5 collections flatten and keep the integer keys?


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?


Solution

  • 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