繁体   English   中英

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

[英]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循环。 看起来像这样:

<?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组”总是会首先出现。 当像开关中的“ break”正在执行匹配时,您仍然希望“短路”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM