如何对Laravel Collection按值分组并生成分隔键?
如何基于值对Laravel Collection进行分组并合并键
这问题挺常见的,咱们可以用Laravel Collection的几个方法组合起来轻松实现你的需求,核心思路是先按值分组,再将分组后的键合并成你想要的格式。
假设你的原始集合是这样的:
$collection = collect([ 'CASSETE_1' => '500', 'CASSETE_2' => '500', 'CASSETE_3' => '100', 'CASSETE_4' => '100', ]);
接下来分两步处理:
- 按值分组:用
groupBy()方法,传入值作为分组依据,这会得到一个以值为键、对应原键数组为值的新集合:
$grouped = $collection->groupBy(function ($value, $key) { return $value; }); // 此时$grouped的结构是: // Collection { // #items: array:2 [ // "500" => Collection { #items: ["CASSETE_1", "CASSETE_2"] }, // "100" => Collection { #items: ["CASSETE_3", "CASSETE_4"] } // ] // }
- 转换键值格式:用
mapWithKeys()方法,将分组后的原键数组合并成用/分隔的字符串作为新键,值保留原来的分组值:
$result = $grouped->mapWithKeys(function ($keys, $value) { return [ implode(' / ', $keys->all()) => $value ]; });
如果你喜欢更简洁的写法,把两步合并成一行也完全没问题:
$result = $collection->groupBy(fn($v) => $v)->mapWithKeys(fn($keys, $val) => [implode(' / ', $keys) => $val]);
最终$result的结构就完全符合你的需求了:
Collection {#250 ▼ #items: array:2 [▼ "CASSETE_1 / CASSETE_2" => "500" "CASSETE_3 / CASSETE_4" => "100" ] }
简单拆解下用到的方法:
groupBy():按指定规则(这里是元素的值)对集合进行分组mapWithKeys():遍历集合并返回关联数组,用来重新定义集合的键值对implode():把数组元素拼接成指定格式的字符串,这里用/作为分隔符
内容的提问来源于stack exchange,提问作者Luis felipe De jesus Munoz
相关产品推荐
相关产品推荐

