malinga91's avatar

How to use mapToGroups in multidimensional array?

I have an eloquent collection and I have used the mapToGroups as follows.

 $new = $rolls->map(function ($roll) {
		return [
		...$roll->toArray(),
		'defects' => $roll->defects->mapToGroups(function ($defect) {
                 return [$defect['td_block'] => $defect]; // td_block > block_1, block_2, block_3
		})
		];
 });

The new collection is this.

[
    "id" => 61
    "batch_id" => 27
    "defects" => [
		'block_1' => [
			0 => ["category" => "category_two", td_block" => block_1],
			1 => ["category" => "category_one", td_block" => block_1],
			2 => ["category" => "category_three", td_block" => block_1],
			3 => ["category" => "category_one", td_block" => block_1],
		],
		'block_2' => [
			0 => ["category" => "category_three", td_block" => block_2],
			1 => ["category" => "category_one", td_block" => block_2],
		] 
      ]
]

I want the above array to change as follows.

[
    "id" => 61
    "batch_id" => 27
    "defects" => [
		'category_one' => [
			block_1 => ["category" => "category_one", td_block" => block_1],
			block_2 => ["category" => "category_one", td_block" => block_2],
			block_3 => ["category" => "category_one", td_block" => block_3],
			block_4 => ["category" => "category_one", td_block" => block_4],
		],
		'category_three' => [
			block_3 => ["category" => "category_three", td_block" => block_3],
			block_4 => ["category" => "category_three", td_block" => block_4],
		] 
      ]
]

I tried several options like mapWithKeys, but didn't work.

0 likes
3 replies
tisuchi's avatar

@malinga91 Does it work?

$new = $rolls->map(function ($roll) {
    return [
        ...$roll->toArray(),
        'defects' => $roll->defects
            ->groupBy('category') // Group by category first
            ->map(function ($group) {
                // Within each category, organize by td_block
                return $group->keyBy('td_block');
            })
    ];
});
1 like
malinga91's avatar

@tisuchi, One more thing

What do you suggest if multiple objects exist for block_1,block_2, etc?

[
    "id" => 61
    "batch_id" => 27
    "defects" => [
		'category_one' => [
			block_1 => [
				["category" => "cat_one", td_block" => block_1, "name"=>"Item 1"],
				["category" => "cat_one", td_block" => block_1, "name"=>"Item 2"],
				["category" => "cat_one", td_block" => block_1, "name"=>"Item 3"],
			],
			block_2 => [
				["category" => "cat_one", td_block" => block_2, "name"=>"Item 1"],
				["category" => "cat_one", td_block" => block_2, "name"=>"Item 2"],
				["category" => "cat_one", td_block" => block_2, "name"=>"Item 3"],
			],
			block_3 => ["category" => "cat_one", td_block" => block_3],
			block_4 => ["category" => "cat_one", td_block" => block_4],
		],
		'category_three' => [
			block_3 => ["category" => "category_three", td_block" => block_3],
			block_4 => ["category" => "category_three", td_block" => block_4],
		] 
      ]
]

Thanks in advance

Please or to participate in this conversation.