I have an array like that:
[ [ "id" => 1, "name" => "Root Category", "child" => [ "id" => 2, "name" => "Sub category", "child" => [ "id" => 3, "name" => "Last level category", ], ], ], [ "id" => 1, "name" => "Root Category", "child" => [ "id" => 2, "name" => "Sub category", "child" => [ "id" => 6, "name" => "Last level category #2", ], ], ], ];
In these arrays first level and second level are the same, only the last level is different. I want to combine them into one array. I want to receive result like that:
[ [ "id" => 1, "name" => "Root Category", "child" => [ "id" => 2, "name" => "Sub category", "child" => [ [ "id" => 3, "name" => "Last level category", ], [ "id" => 6, "name" => "Last level category #2", ] ], ], ] ];
Advertisement
Answer
collect($arr) ->groupBy(function ($item) { return $item['id'] . $item['child']['id']; }) ->map(function ($group) { $first = $group->first(); $first['child']['child'] = $group->pluck('child.child')->toArray(); return $first; }) ->values() ->toArray()