将二维数组中的行分组并计算每个组中的行数

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

我有一个包含 200 个项目的数组。我想输出数组,但将具有共同值的项目分组。类似于 SQL 的 GROUP BY 方法。这应该相对容易做到,但我还需要对组项目进行计数。

有没有人有有效的方法来做到这一点?这将在每次页面加载时发生,因此我需要它快速且可扩展。

我能否将结果转储到 Lucene 或 SQLite 之类的东西中,然后在每次加载页面时对该文档运行查询?

php arrays multidimensional-array grouping counting
6个回答
30
投票

只需遍历数组并为组使用另一个数组。它应该足够快,并且可能比使用 sqlite 或类似软件时所涉及的开销更快。

$groups = array();
foreach ($data as $item) {
    $key = $item['key_to_group'];
    if (!isset($groups[$key])) {
        $groups[$key] = array(
            'items' => array($item),
            'count' => 1,
        );
    } else {
        $groups[$key]['items'][] = $item;
        $groups[$key]['count'] += 1;
    }
}

14
投票
$groups = array();
foreach($items as $item)
    $groups[$item['value']][] = $item;
foreach($groups as $value => $items)
    echo 'Group ' . $value . ' has ' . count($items) . ' ' . (count($items) == 1 ? 'item' : 'items') . "\n";

2
投票

这是一个简单的例子:

$a = array(1, 2, 3, 1, 2, 3, 3, 2, 3, 2, 3, 4, 4, 1);
$n = array_count_values($a);
arsort($n);

print_r($n);

数组( [3] => 5 [2] => 4 [1] => 3 [4] => 2 )


2
投票
$aA = array_count_values(array(1,2,3,4,5,1,2,3,4,5,6,1,1,1,2,2));
$aB = array();
foreach($aA as $index=>$aux){
     array_push($aB,$index);
}
print_r($aB);

结果:

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 ) 

0
投票

如果问题中没有示例数据(最小的、清晰的可验证示例),则很难自信地就执行任务的最佳方式给出准确的建议。一种方法是在结果数组中使用临时分组键。如果之前未遇到标识键,则将遇到的整行和附加的

count
元素存储在结果数组中。附加元素的值应为
0
。然后无条件增加
count
值。当循环完成后,如果你不想要分组键,你可以调用
array_values()
.

代码:(演示

$result = [];
foreach ($array as $row) {
    $result[$row['group']] ??= $row + ['count' => 0]; // only save 1st of group with 0 count
    ++$result[$row['group']]['count']; // increment the count
}
var_export(array_values($result));

-1
投票
"$Switches" Array with [3] elements
0       
    SwitchID    1   
    name    k�  
    type    output  
    displayAs   button  
    value   on  
    groupname   group1  
1   Array [6]   
2   Array [6]   


// this will sort after groupname

$result = array();
$target = count($Switches);
for($i=0;$i<$target;$i++)
{
    $groupname = $Switches[$i]["groupname"];

    $result[$groupname][] = $Switches[$i];
}

// count amount of groups
$groupCount = count($result);

...还是我错过了什么?

© www.soinside.com 2019 - 2024. All rights reserved.