是否有更有效的方法按阵列分组?

时间:2014-06-08 13:36:23

标签: php arrays

我在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;
        }
    }
?>

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

这样您可以使用$groups[groupName][some index]['title']

访问它们

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

答案 1 :(得分:0)

如果你知道你的结果总是有序,那就说吧

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

array(Group A, Group D, Group E) 

您可以通过每次都不执行所有比较来提高效率。换句话说,不要做A组&#39;比较如果你在记录的数组中的第二组,作为&#39;组A&#39;总是先出现。你仍然想要&#34;短路&#34;当你的比赛像你的'休息'一样出局时正在做转换。

这里有一些类似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
    }
  }
}