Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 418
GTMeteor Avatar asked Dec 11 '17 16:12

GTMeteor


2 Answers

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

like image 135
bmagg Avatar answered Oct 31 '22 01:10

bmagg


You can't use flatten() here. I don't have an elegant solution, but I've tested this and it works perfectly for your array:

foreach ($array as $items) {
    foreach ($items as $key => $item) {
        $newArray[$key] = $item;
    }
}

dd($newArray);
like image 39
Alexey Mezenin Avatar answered Oct 31 '22 02:10

Alexey Mezenin