Сортировка и фильтрация по нескольким критериям из вызова REST API - PullRequest
0 голосов
/ 27 ноября 2018

Я хотел бы отсортировать данные, полученные от вызова API, по нескольким критериям, а затем отфильтровать их для отображения данных в 2 разных таблицах.

Это код, который у меня сейчас есть для сортировки данных., на 1) machine-> id, 2) date, 3) ordering.

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 голосов
/ 27 ноября 2018

Это происходит потому, что вы используете идентификатор машины в функции сравнения, но после фильтрации разных машин.

Вспомните случай:

1. time = 2015, id = 3, order 2
2. time = 2016, id = 4, order 3
3. time = 2013, id = 3, order 3

при сравнении ордеров 1 и 2 остается, но на 2 и 3 они меняются местами, потому что ID но n вы получите 1 перед 3, чтонеправильный порядок для вас (даты ...)

Я рекомендую сначала разбить большой массив для машинного массива, как вы это делали с:

$machine1141 = array_filter($obj, function($object){
    return ($object->machine->id == 1141);
});

Затем используйте функцию сравнения как:

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");

Надеюсь, это поможет!

...