对 Laravel 集合进行分组和翻转,为每个分组值创建分隔键值

问题描述 投票:0回答:3

一个群体如何才能根据自己的价值观进行收藏?例如这个:

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"
  ]
}
php laravel collections grouping delimited
3个回答
1
投票

没有原生方法可以做到这一点,您需要制作自定义函数。这就是我所做的

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
)

0
投票

尝试下面的方法(首先将集合转换为数组):

$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 )

您应该能够通过将 ',' 更改为您需要的字符来构造您想要的索引字符串。


0
投票

这完全可以通过 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,
)
© www.soinside.com 2019 - 2024. All rights reserved.