将平面数组中的重复值分组到各自的子数组中

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

我有一个数组,我想通过将相同的值分组在一起将其转换为二维数组。

一旦所有具有相同值的元素都被推入组中,我想使用该组来做某事,然后继续循环并设置下一组,直到原始

$array
的所有内容都已被使用。

public function adjust($array){ 
  // $array = [1, 1, 2, 2, 8, 8, 8, 9, 20]
 
  $group = array()

  for ($i = 0; $i < sizeof($array); $i++){
   // code here
   // result should be $group = [1, 1] 
   // use $group for something, reset its contents, 
   // continue loop until group is [2, 2],
   // rinse and repeat
 }    
}

我不一定需要循环,我只需要能够将

$array
切成 5
$groups
(对于这个特定示例),以便能够处理数据。

有没有一种更简单的方法来解决这个问题,而无需一堆 if/else 条件?

php arrays grouping
3个回答
1
投票

$chunk
初始化为包含第一个元素的数组。然后循环遍历数组的其余部分,将当前元素与
$chunk
中的元素进行比较。如果不同,处理
$chunk
并重置。

$chunk = array[$array[0]];
for ($i = 1; $i < count($array); $i++) {
    if ($array[$i] != $chunk[0]) {
        // use $chunk for something
        $chunk = array($array[$i]);
    } else {
        $chunk[] = $array[$i];
    }
}
// process the last $chunk here when loop is done

0
投票

array_count_values
更可能是您想要的。

$array = [1, 1, 2, 2, 8, 8, 8, 9, 20];
foreach (array_count_values($array) as $val => $count) {
    $chunk = array_fill(0, $count, $val); // contains [1, 1], [2, 2], etc.
}

0
投票

这可以在没有任何条件的情况下完成,并且无需使用

array_count_values()
进行预先分组。不需要迭代函数调用。当您将每个值推入其自己的专用子数组时,只需将每个值用作临时分组键即可。即使重复值不连续,此技术也会对值进行分组。如果您想删除临时钥匙,只需拨打
array_values()
即可。

语言构造循环:(演示

$result = [];
foreach ($array as $value) {
    $result[$value][] = $value;
}
var_export(array_values($result));

功能循环:(演示

var_export(
    array_values(
        array_reduce(
            $array,
            function($result, $value) {
                $result[$value][] = $value;
                return $result;
            },
            []
        )
    )
);

两者都输出以下数据结构:

[[1, 1], [2, 2], [8, 8, 8], [9], [20]]
© www.soinside.com 2019 - 2024. All rights reserved.