根据来自REST API调用的多个条件进行排序和过滤

时间:2018-11-27 08:05:53

标签: php arrays sorting filtering usort

我想对从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

我在做什么错了?

1 个答案:

答案 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}}

希望有帮助!