【问题标题】:Grouping arrays in PHP在 PHP 中对数组进行分组
【发布时间】:2010-11-02 05:06:02
【问题描述】:

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

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

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

任何想法将不胜感激。

【问题讨论】:

  • Lucene 或 sqlite 很可能比 PHP 解决方案效率低得多。
  • 看看这个:应该可以解决你的问题pastebin.com/UJAqnKSs

标签: php arrays algorithm data-structures grouping


【解决方案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);

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

【讨论】:

  • 我认为这个答案缺少清晰/解释。
【解决方案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 ) 

【讨论】:

    【解决方案3】:

    这是一个简单的例子:

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

    【讨论】:

      【解决方案4】:

      只需遍历数组并为组使用另一个数组。它应该足够快,并且可能比使用 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;
          }
      }
      

      【讨论】:

      • sql 服务器在大多数情况下做得更快
      • isset 非常重要。这就是我错过的
      【解决方案5】:
      $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";
      

      【讨论】:

        猜你喜欢
        • 2022-11-17
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多