php 从二维数组中删除完全重复的行,并计算每个唯一行的出现次数

vlurs2pr  于 2023-04-19  发布在  PHP
关注(0)|答案(2)|浏览(139)

我需要过滤掉我的二维数组中的重复行,并在保留的唯一行中附加一个元素,该元素包含原始数组中唯一行存在的次数。
我想使用array_unique($array, SORT_REGULAR),但是删除重复项是不够的--我实际上需要存储每个唯一行的重复行的计数。
我尝试了array_search()和循环,但没有一次得到正确的结果。我的项目数据有超过500,000个条目,但这里有一个基本的例子:
输入:

[
    ['manufacturer' => 'KInd', 'brand' => 'ABC', 'used' => 'true'],
    ['manufacturer' => 'KInd', 'brand' => 'ABC', 'used' => 'true'],
    ['manufacturer' => 'KInd', 'brand' => 'ABC', 'used' => 'false'],
]

输出:

[
    ['manufacturer' => 'KInd', 'brand' => 'ABC', 'used' => 'true', 'count' => 2],
    ['manufacturer' => 'KInd', 'brand' => 'ABC', 'used' => 'false', 'count' => 1],
]
dtcbnfnu

dtcbnfnu1#

您不需要使用任何复杂的序列化或编码来创建组合键以进行分组。只需将每行的值内爆(假设它们都包含相同顺序的相同列)以创建结果数组的标识键。
在第一次遇到时,将行的数据存储在组中,并将组的计数设置为1;在任何后续遭遇中,增加该组的计数器。
代码:(Demo

$result = [];
foreach ($array as $row) {
    $compositeKey = implode('_', $row);
    if (!isset($result[$compositeKey])) {
        $result[$compositeKey] = $row + ['count' => 1];
    } else {
        ++$result[$compositeKey]['count'];
    }
}
var_export(array_values($result));

输出:

array (
  0 => 
  array (
    'manufacturer' => 'KInd',
    'brand' => 'ABC',
    'used' => 'true',
    'count' => 2,
  ),
  1 => 
  array (
    'manufacturer' => 'KInd',
    'brand' => 'ABC',
    'used' => 'false',
    'count' => 1,
  ),
)

其他利用多个标识列值进行分组的帖子:

u5rb5r59

u5rb5r592#

如果我没理解错的话,这个应该会有帮助

function getUniqWithCounts(array $data): array
{
    $result = [];
    foreach ($data as $item) {
        $hash = md5(serialize($item));

        if (isset($result[$hash])) {
            $result[$hash]['count']++;
            continue;
        }
        $item['count'] = 1;
        $result[$hash] = $item;
    }

    return array_values($result);
}

相关问题