сортировка — php сложная коллекция

У меня довольно сложная коллекция красноречия, которую нужно отсортировать по projectid, дате, имени пользователя.

Я искал в Google, но никто не спрашивал и не писал об этом сложном виде.

Если я использую только порядок desc или asc с функцией sortBy. Это работает, но если я пытаюсь использовать desc / asc, то оба смешиваются ..

Как я могу решить эту проблему???

структура коллекции

collection {
array (size=148)
0 =>
attribute:
id:100,
date:"2015-02-03"relations:
0 project(belongstomany relationship)
projectid: 1
1 user(belongstomany relationship)
username:"test"}

Это должно быть отсортировано так

project id(desc)   date(desc)  name(asc)
9                  2015-02-31  test1
9                  2015-02-30  test2
8                  2015-02-30  test2
7                  2015-02-29  test3
6                  2015-02-28  test4
5                  2015-02-27  test5

0

Решение

Вы можете делать то, что вы хотите, но вы должны использовать sort() метод, а не sortBy() метод. sort() Метод примет замыкание, которое можно использовать для определения собственного алгоритма сортировки. В основном, если вы передаете закрытие sort(), это будет вызывать PHP usort() с вашим закрытием, чтобы отсортировать предметы.

Это всего лишь приблизительное представление о том, что вы ищете. Вам, вероятно, придется настроить его, так как есть мало неопределенности из того, что вы опубликовали. Вы можете определить это как фактическую функцию для передачи в sort()или вы можете просто передать его в sort() как анонимная функция.

function ($a, $b) {
/**
* Your question states that project is a belongsToMany relationship.
* This means that project is a Collection that may contain many project
* objects, and you need to figure out how you want to handle that. In
* this case, I just take the max projectid from the Collection (max,
* since this field will be sorted desc).
*
* If this is really just a belongsTo, you can simplify this down to
* just $a->project->projectid, etc.
*/
$aFirst = $a->project->max('projectid');
$bFirst = $b->project->max('projectid');

/**
* If the projectids are equal, we have to dig down to our next comparison.
*/
if ($aFirst == $bFirst) {
/**
* Since the first sort field (projectids) is equal, we have to check
* the second sort field.
*/

/**
* If the dates are equal, we have to dig down to our next comparison.
*/
if ($a->date == $b->date) {
/**
* Your question states that user is a belongsToMany relationship.
* This means that user is a Collection that may contain many user
* objects, and you need to figure out how you want to handle that.
* In this case, I just take the min username from the Collection
* (min, since this field will be sorted asc).
*/
$aThird = $a->user->min('username');
$bThird = $b->user->min('username');

/**
* If the final sort criteria is equal, return 0 to tell usort
* that these two array items are equal (for sorting purposes).
*/
if ($aThird == $bThird) {
return 0;
}

/**
* To sort in ascending order, return -1 when the first item
* is less than the second item.
*/
return ($aThird < $bThird) ? -1 : 1;
}

/**
* To sort in descending order, return +1 when the first item is
* less than the second item.
*/
return ($a->date < $b->date) ? 1 : -1;
}

/**
* To sort in descending order, return +1 when the first item is
* less than the second item.
*/
return ($aFirst < $bFirst) ? 1 : -1;
}

Для получения дополнительной информации о том, как usort() работает, можешь проверить документы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]