有没有更有效的方法来按数组分组


Is there a more efficient way to group this by array?

我在一个while循环中,从数据库中收集标题和相应的数组。

我的数据看起来像这样(请注意,我需要更多的字段,但为了简单起见,我只显示两个):

**Title**               |   **Groups**
Random Title One    |   array(Group A)
Another Title       |   array(Group A, Group B, Group C, Group D, Group E) 

我用while循环遍历每一行。现在我要按群来展示。这样的:

Group A:    Random Title One, Another Title
Group B:    Another Title
Group C:    Another Title
Group D:    Another Title
Group E:    Another Title

我认为处理这个问题的最好方法是在我的while循环中使用foreach循环遍历Groups。它看起来像这样:

<?php
    foreach ($arrayGroups as $group) {
        switch ($group) {
            case "Group A":
                $arrGroupA[]['title'] = $title;
                break;
            case "Group B":
                $arrGroupB[]['title'] = $title;
                break;
            case "Group C":
                $arrGroupC[]['title'] = $title;
                break;
            case "Group D":
                $arrGroupD[]['title'] = $title;
                break;
            case "Group E":
                $arrGroupE[]['title'] = $title;
                break;
        }
    }
?>

然而,即使我知道不超过五个组,我也不喜欢这种方式,并怀疑这是否是最好的方法。

任何想法?

您可以尝试将它们放在一个数组中,例如:

foreach ($arrayGroups as $group) {
       $groups[$group][] = array( 
            'title' => $title, 
       );
}

这样你就可以通过$groups[groupName][some index]['title']

访问它们

虽然不确定它是否在性能方面更快,但它允许您自动输入可变数量的组

如果你知道你的结果总是有序的,让我们说

array(Group A, Group B, Group C, Group D, Group E) 

array(Group A, Group D, Group E) 

等。

您也许可以通过每次不执行所有比较来提高效率。换句话说,如果你在记录数组中的第二组上,不要进行"组A"比较,因为"组A"总是首先出现。当有匹配时,你仍然想要"短路",就像你的"断开"在开关中所做的那样。

下面是一些类似java的伪代码对不起,我不是一个php的家伙:

//traverse all groups for the current record
for (int i=0; i<currentRecordGroups.length; i++) {
  // traverse the possible groups, starting with the index of the 
  // current group from the current record (allGroups must also be sorted)
  for(int j = i; j<allGroups.length; j++) {
    if(currentRecordGroups[i] == allGroups[j]) {
      // add the title to the collection for group allGroups[j] here...
      break; //break for j
    }
  }
}