一个群体如何才能根据自己的价值观进行收藏?例如这个:
Collection {#250 ▼
#items: array:4 [▼
"CASSETE_1" => "500"
"CASSETE_2" => "500"
"CASSETE_3" => "100"
"CASSETE_4" => "100"
]
}
我需要对其进行分组并得到如下结果:
Collection {#250 ▼
#items: array:4 [▼
"CASSETE_1 / CASSETE_2" => "500"
"CASSETE_3 / CASSETE_4" => "100"
]
}
这可能吗?
我使用了
unique()
,但结果是:
Collection {#251 ▼
#items: array:2 [▼
"CASSETE_1" => "500"
"CASSETE_3" => "100"
]
}
没有原生方法可以做到这一点,您需要制作自定义函数。这就是我所做的
1 将集合转换为数组
2 翻转它
3 按值过滤并通过 / 连接它们
4 再翻转一下
$arr=array("CASSETE_1" => "500",
"CASSETE_2" => "500",
"CASSETE_3" => "100",
"CASSETE_4" => "100");
$result = array();
foreach (array_flip($arr) as $k=>$v) {
$result[$k] = implode("/",array_keys(array_filter($arr, function($elem) use($k){
return $elem == $k;
})));
}
echo "<pre>";
print_r(array_flip($result));
输出
Array
(
[CASSETE_1/CASSETE_2] => 500
[CASSETE_3/CASSETE_4] => 100
)
尝试下面的方法(首先将集合转换为数组):
$input = [
"CASSETE_1" => "500",
"CASSETE_2" => "500",
"CASSETE_3" => "100",
"CASSETE_4" => "100",
];
$values = array_unique(array_values($input));
// output results
$output =[];
foreach ($values as $v) {
$index = implode(", ", array_keys($input, $v));
$output[$index] = $v;
}
print_r($output);
输出应该是:
Array ( [CASSETE_1, CASSETE_2] => 500, [CASSETE_3, CASSETE_4] => 100 )
您应该能够通过将 ',' 更改为您需要的字符来构造您想要的索引字符串。
这完全可以通过 Laravel 的集合方法来完成。使用
mapToGroups()
按金额分组,然后使用 mapWithKeys()
调用 implode()
以形成具有分隔键的所需关联结构。
代码:(PHPize演示)
$collection = collect([
"CASSETE_1" => "500",
"CASSETE_2" => "500",
"CASSETE_3" => "100",
"CASSETE_4" => "100",
]);
var_export(
$collection->mapToGroups(fn($amt, $cassete) => [$amt => $cassete])
->mapWithKeys(fn($cassetes, $amt) => [$cassetes->implode(' / ') => $amt])
->toArray()
);
输出:
array (
'CASSETE_1 / CASSETE_2' => 500,
'CASSETE_3 / CASSETE_4' => 100,
)