基于多个规则对对象进行排序

时间:2015-05-20 06:19:21

标签: php sorting

我的学校的合唱团每年都会在情人节上演唱情人节。合唱团全天都在课堂上唱歌,向那些从他们的朋友或其他重要人物那里收到情人节礼物的人唱歌。

我们每年销售约1000首歌唱情人节礼物。这些需要根据过多的规则进行排序 - 例如:

  • 没有一个班级的时间总共可以超过150个情人节礼物。 (有五组歌手,我们发现每个小组在每个课程期间提供超过30个情人节在后勤上是不可能的。)
  • 任何在零日或七日期间参加课程表的情人都必须在零或七期内收到他们的情人。
  • 歌唱情人节的负荷最好尽可能在一天中均匀分布,以便第三期不会有150个情人节,而第四期则不会有20个情人节。
  • 五组歌手中的每一组都应该将他们的分娩位于相同的相对区域,以尽量减少在运输过程中浪费的时间。

列表还在继续。目前,所有1000个情人节都是手工分拣,这是非常低效的。我正在考虑制作一个PHP或JS脚本来自动化该过程。以下是我设想的方式:

  1. 购买情人节礼物时,学生将填写他们的名字收件人姓名以及课程期限的Google表格期间,他们希望收件人收到他或她的情人节。

  2. 该脚本将逐行从生成的电子表格中获取数据,并为每一行创建情人节对象

  3. 对于每个情人节对象,脚本将查找收件人的时间表,并以的形式将他或她的日程安排作为房间号码添加到情人节对象中对象变量/属性(即$ period1 = 312表示收件人的第一个句号类在312房间。)

    • 此部分可能必须在脚本提取数据之前在Google电子表格中手动完成,因为我不确定我是否可以访问学校数据库。
  4. 以下是我卡住​​的部分。一旦脚本有1000个左右的Valentine对象列表,每个对象都有自己的 $ sender ,$ recp,$ period0 通过 $ period7, $ prefPeriod 值,不知何故,脚本将将每个对象排序到相应的类周期基于上述规则和每个对象中的数据。

  5. 如果PHP不是这份工作的最佳语言,我可以接受建议。我最初选择PHP是因为它是我最熟悉的语言。

    对此的任何帮助都将非常感激。

    TL; DR:我需要根据几个使用这些对象数据的规则将对象分类。特性

1 个答案:

答案 0 :(得分:0)

看看usort()。它允许您使用任何用户功能进行排序。在该功能中,您可以根据需要比较对象。在下面的示例中,我比较了它们的属性:property1property2

<?php
$obj1 = new \StdClass;
$obj2 = new \StdClass;
$obj3 = new \StdClass;
$obj1->property1 = '1';
$obj2->property1 = '2';
$obj3->property1 = '2';
$obj1->property2 = '1';
$obj2->property2 = '1';
$obj3->property2 = '2';
$objs = [$obj2, $obj1, $obj3]; //after sorting, it should be obj1, obj2, obj3

//first we sort by property1, then by property2
usort($objs, function($a, $b)
{
    $result = strcmp($a->property1, $b->property1);
    if ($result === 0)
        $result = strcmp($a->property2, $b->property2);
    return $result;
});

print_r($objs);

结果:

Array
(
    [0] => stdClass Object
        (
            [property1] => 1
            [property2] => 1
        )
    [1] => stdClass Object
        (
            [property1] => 2
            [property2] => 1
        )
    [2] => stdClass Object
        (
            [property1] => 2
            [property2] => 2
        )
)

完美排序!

基本上,如果对象相等,您的自定义函数应返回1,-1或0。 strcmp是完美的,因为它返回兼容的值。要按多个属性排序,我们通过将第一个结果与0进行比较来检查两个对象是否具有相同的property1。如果它们相同,我们会比较property2。如您所见,这可以轻松地进一步扩展到其他属性。