2015-05-20 35 views
-4

我校的合唱团每年在情人节执行歌唱情人节。合唱团全天从班级到班级唱歌,向从朋友或其他人处收到情人节的人唱歌。基于多个规则对物品进行排序

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

  • 没有一个节课的时间总共可以有更多的150个情人节的。 (有五组歌手,我们已经发现每个组在每个阶段的交付时间超过30个情人在逻辑上是不可能的。)
  • 任何情绪接受者在零或第七周期的课程安排中都必须上课在零或七周期内收到情人节礼物。
  • 歌唱情人节的负荷应该尽可能地在整个一天中均匀分布,以便在第三阶段不会有150个情人节,第四个阶段则不会有20个情人节。
  • 五组歌手中的每一组歌手都应该将他们的送货放在相同的相对区域,以尽量减少在运输过程中浪费的时间。

这个名单还在继续。目前,所有1000个情人节正在手动分拣,这是无效的。我正在考虑制作一个PHP或JS脚本来自动化这个过程。这里是我想象它:

  1. 在购买情人节,学生将填写一份谷歌形成他们的名字,则收件人的姓名堂课在此期间,他们更喜欢接收者收到他或她的情人。

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

  3. 对于每一个情人节对象,该脚本将查找收件人的时间表和房间号码添加自己的日程,以情人节对象对象变量的形式/属性(即$间隔1 = 312种手段收件人的第一个时期的阶级是312室)

    • 这部分可能不得不用手在谷歌电子表格完成的脚本读取其数据之前,因为我不知道,我将有机会获得学校数据库。
  4. 这里是我卡住的部分。一旦脚本有1000个左右的情人对象的列表,每个都有自己的$发件人,$ RECP,通过$ period7,$ prefPeriod值,不知何故,该脚本将排序每个对象到$ period0根据上述规则和每个对象中的数据确定适当的课程时间段

如果PHP不是最好的工作语言,我愿意接受建议。我最初选择PHP是因为它是我最熟悉的语言。

对此的任何帮助将不胜感激。

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

+1

你的问题太长了,主要关注背景,而不是直截了当。 –

+0

^因此**粗体**部分和TL; DR在最后。 –

回答

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。正如你所看到的,这可以进一步扩展到其他属性,轻松。

相关问题