我想对从API调用中接收到的数据按多个条件进行排序,然后对其进行过滤以在2个不同的表中显示数据。
这是我现在要在1)机器-> id,2)日期,3)排序上对数据进行排序的代码。
function cmp($a, $b)
{
if (strtotime($a->date) == strtotime($b->date)){
return $a->ordering - $b->ordering;
}
if ($a->machine->id == $b->machine->id) {
return strtotime($a->date) - strtotime($b->date);
}
return strcmp($a->machine->id, $b->machine->id);
}
usort($obj, "cmp");
此后,我仅过滤具有特定机器-> id的数据以在表中显示该数据:
$machine1 = array_filter($obj, function($object){
return ($object->machine->id == 1141);
});
和
$machine2 = array_filter($obj, function($object){
return ($object->machine->id == 1259);
});
现在machine1表中的数据如下所示,日期排序无法正常工作:
2018-11-26T23:00:00Z - ordering: 1
2018-11-26T23:00:00Z - ordering: 3
2018-11-27T23:00:00Z - ordering: 2
2018-11-27T23:00:00Z - ordering: 3
2018-11-27T23:00:00Z - ordering: 4
2018-11-27T23:00:00Z - ordering: 5
2018-11-25T23:00:00Z - ordering: 1
2018-11-25T23:00:00Z - ordering: 2
2018-11-26T23:00:00Z - ordering: 2
2018-11-27T23:00:00Z - ordering: 1
2018-11-25T23:00:00Z - ordering: 3
2018-11-25T23:00:00Z - ordering: 4
2018-11-25T23:00:00Z - ordering: 5
2018-11-25T23:00:00Z - ordering: 6
2018-11-25T23:00:00Z - ordering: 7
2018-11-25T23:00:00Z - ordering: 8
2018-11-25T23:00:00Z - ordering: 9
2018-11-25T23:00:00Z - ordering: 10
2018-11-25T23:00:00Z - ordering: 11
2018-11-26T23:00:00Z - ordering: 4
2018-11-26T23:00:00Z - ordering: 5
2018-11-26T23:00:00Z - ordering: 6
2018-11-26T23:00:00Z - ordering: 7
2018-11-26T23:00:00Z - ordering: 8
2018-11-26T23:00:00Z - ordering: 9
2018-11-26T23:00:00Z - ordering: 10
2018-11-26T23:00:00Z - ordering: 11
2018-11-26T23:00:00Z - ordering: 12
2018-11-26T23:00:00Z - ordering: 13
2018-11-26T23:00:00Z - ordering: 14
2018-11-26T23:00:00Z - ordering: 15
2018-11-26T23:00:00Z - ordering: 16
我在做什么错了?
答案 0 :(得分:0)
之所以发生这种情况,是因为您在比较功能中使用了机器ID,但是在过滤了不同的机器之后。
考虑一下情况:
ID
在比较1和2的顺序时,它们停留在2和3上,因为$machine1141 = array_filter($obj, function($object){
return ($object->machine->id == 1141);
});
交换,但是n会在3之前得到1,这对您来说是错误的顺序(日期...)
我建议先像使用以下方法那样将大阵列拆分为机器阵列:
function cmp($a, $b)
{
if (strtotime($a->date) == strtotime($b->date))
return $a->ordering - $b->ordering;
return strtotime($a->date) - strtotime($b->date);
}
usort($machine1141, "cmp");
然后将比较功能用作:
{{1}}
希望有帮助!