我的学校的合唱团每年都会在情人节上演唱情人节。合唱团全天都在课堂上唱歌,向那些从他们的朋友或其他重要人物那里收到情人节礼物的人唱歌。
我们每年销售约1000首歌唱情人节礼物。这些需要根据过多的规则进行排序 - 例如:
列表还在继续。目前,所有1000个情人节都是手工分拣,这是非常低效的。我正在考虑制作一个PHP或JS脚本来自动化该过程。以下是我设想的方式:
购买情人节礼物时,学生将填写他们的名字,收件人姓名以及课程期限的Google表格期间,他们希望收件人收到他或她的情人节。
该脚本将逐行从生成的电子表格中获取数据,并为每一行创建情人节对象。
对于每个情人节对象,脚本将查找收件人的时间表,并以的形式将他或她的日程安排作为房间号码添加到情人节对象中对象变量/属性(即$ period1 = 312表示收件人的第一个句号类在312房间。)
以下是我卡住的部分。一旦脚本有1000个左右的Valentine对象列表,每个对象都有自己的 $ sender ,$ recp,$ period0 通过 $ period7,和 $ prefPeriod 值,不知何故,脚本将将每个对象排序到相应的类周期基于上述规则和每个对象中的数据。
如果PHP不是这份工作的最佳语言,我可以接受建议。我最初选择PHP是因为它是我最熟悉的语言。
对此的任何帮助都将非常感激。
TL; DR:我需要根据几个使用这些对象数据的规则将对象分类。特性
答案 0 :(得分:0)
看看usort()
。它允许您使用任何用户功能进行排序。在该功能中,您可以根据需要比较对象。在下面的示例中,我比较了它们的属性:property1
和property2
。
<?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
。如您所见,这可以轻松地进一步扩展到其他属性。