当前位置: 首页 > 知识库问答 >
问题:

分组算法(具有PHP和Laravel收集支持)

林鸿飞
2023-03-14

我需要一些人帮我组织一个团体...我在一个Laravel集合中有一些对象,下面是一些json表示形式的示例数据

[
  {
    "group": "WHITE",
    "name": "John Doe",
    "sequence": 1
  },
  {
    "group": "WHITE",
    "name": "John Doe Jr",
    "sequence": 2
  },
  {
    "group": "BLUE",
    "name": "John Doe Sr",
    "sequence": 3
  },
  {
    "group": "BLUE",
    "name": "John Doe Again",
    "sequence": 4
  },
  {
    "group": "RED",
    "name": "Mr John Doe",
    "sequence": 5
  },
  {
    "group": "RED",
    "name": "Ms Joahnna Doe",
    "sequence": 6
  },
  {
    "group": "BLUE",
    "name": "Dr Johnny Doe",
    "sequence": 7
  },
  {
    "group": "RED",
    "name": "Sir John Doe",
    "sequence": 8
  },
  {
    "group": "RED",
    "name": "Sir John Doe Senior",
    "sequence": 9
  },
  {
    "group": "WHITE",
    "name": "Ms John Doe",
    "sequence": 10
  }
]

我希望能够按组名对这些对象进行分组,但保持序列不变,并且重复出现两次或更多次的键,如下所示:

{
    "WHITE": [
        { "name": "John Doe", "sequence": 1 },
        { "name": "John Doe Jr", "sequence": 2 }
    ],
    "BLUE": [
        { "name": "John Doe Sr", "sequence": 3 },
        { "name": "John Doe Again", "sequence": 4 }
    ],
    "RED": [
        { "name": "Mr John Doe", "sequence": 5 },
        { "name": "Ms Joahnna Doe", "sequence": 6 }
    ],
    "BLUE": [
        { "name": "Dr Johnny Doe", "sequence": 7 }
    ],
    "RED": [
        { "name": "Sir John Doe", "sequence": 8 },
        { "name": "Sir John Doe Senior", "sequence": 9 }
    ],
    "WHITE": [
        { "name": "Ms John Doe",  "sequence": 10 }
    ]
}

我已经找到了一种这样做的方法:我迭代每个对象,在前面那些序列号不是相应的对象中查找OCCurrences,并且我向对象添加一个新的group_name键,当满足前面的条件(即添加我找到的拆分的计数)时更改这个名称。在我的记忆中,推送原始集合中的每个occurrency让我使用一个简单的$collection->groupby('group_name')

php prettyprint-override">foreach ($data as $stop) {
    $previous_stops_in_group = $stops
        ->where('group', $stop->group)

    $stop->group_name = $stop->group;
    $stop->splitted = false;
    if ($previous_stops_in_group->count() >0) {
        $last_sequence_in_group = $previous_stops_in_group->last()->sequence;
        if (($stop->sequence - $last_sequence_in_group) > 1) {
            $splittedroutes++;
            $stop->group_name = $stop->group . $splittedroutes;
            $stop->splitted = true;
        }
    }


    $last_splitted_group = $stops
        ->where('splitted',true)
        ->where('stop_group',$stop->stop_group)
        ->where('direction', $stop->direction)->last();
    if (!empty($last_splitted_group) && isset($last_splitted_group->group_name)) {
        $stop->group_name = $last_splitted_group->group_name;
    }
    $stops->push($stop);
}

不幸的是,我在大约一年前写了这篇烂杰作,现在我不知道是怎么回事,因为这个算法应该应用于数百条记录,但它并不相应地起作用。

我想找到一个更可预测的解决方案,使用一个表达语法,也许是集合的本机方法,也许是partition()mergeRecursive()的组合?

谁能给我指个方向吗?我真的很挣扎很累...

提前感谢,羞愧我!:)

共有1个答案

爱海
2023-03-14

我不知道是否可以用集合来做得更好,但下面是我的方法:

$items = [
  {
    "group": "WHITE",
    "name": "John Doe",
    "sequence": 1
  },
  // ...
  {
    "group": "WHITE",
    "name": "Ms John Doe",
    "sequence": 10
  }
];

$result = [];
foreach ($items as $item) {
    if (!isset($result[$item['group']])) $result[$item['group']] = [];
    $result[$item['group']][] = [
        'name' => $item['item'],
        'sequence' => $item['sequence'],
    ];
}
 类似资料:
  • 本文向大家介绍PHP经典算法集锦【经典收藏】,包括了PHP经典算法集锦【经典收藏】的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了PHP经典算法。分享给大家供大家参考,具体如下: 1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。 思路:多少行for一次,然后在里面空格和星号for一次。 2、冒泡排序,C里基础算法,从小到大对一组数排序。 思路:这题从小到大,第

  • 集合框架定义了几种可应用于集合和映射的算法。 这些算法在Collections类中定义为静态方法。 有些方法可能会抛出ClassCastException ,当尝试比较不兼容的类型时会发生这种情况,或者在尝试修改不可修改的集合时发生UnsupportedOperationException 。 集合框架算法中定义的方法总结在下表中 - Sr.No. 方法和描述 1 static int binar

  • 问题内容: 有没有有效的方法来合并具有交集的集合。例如: 预期结果是: 所有具有交集(公共分量)的集合都应合并。例如: 因此,这两个集合应该合并: 不幸的是我没有任何有效的解决方案。 更新:结果集的顺序并不重要。 问题答案: @ mkrieger1在注释中提到的一种实现连接组件算法的有效方法是将集合列表转换为一组可散列的冻结集,以便在迭代时找到与当前集合相交的冻结集。从池中删除它: 鉴于,将变为:

  • 我最近接触了Java 8和它的Stream API,最近又接触了它的Collectors API,我发现它有潜力对Stream进行很多很多的转换,但我有一个情况,我不确定Java 8是否可能,甚至根本不可能。我有两个类: 我想知道是否可以从ClassA对象列表中生成一个ClassB对象的分组列表,该列表的值是从ClassA的字段中计算出来的。具体而言: 通过group和ID组合对类进行分组 当关键

  • 我有一个person对象,它有一个名称和一个地址列表作为参数。地址有一个街道,类型,城市,和个人我想获得一个按城市分组的地图。我卡住了

  • 例如,我如何使用类似这样的内容获得订阅类别等于的主题的观察者 多谢了。