Почему эта коллекция laravel не может отсортировать свой индекс по времени?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Почему эта коллекция laravel не может отсортировать свой индекс по времени?

Сообщение Anonymous »

Моя цель — при необходимости фильтровать список явок, сортируя сотрудников по тому, кто из них приходит раньше или позже за определенный период времени. Моя логика следующая:
  • группировка посещаемости по каждому дню
  • ранжирование каждой посещаемости по тому, насколько рано/поздно , в зависимости от параметра, используя свой индекс в отсортированном списке.
  • суммируют свои индексы, чтобы найти наибольшее значение в каждом случае.
Проблема заключается в том, что одна и та же посещаемость всегда имеет один и тот же индекс, независимо от используемого алгоритма сортировки, т. е. самая ранняя всегда содержит 0. Сортировка списка просто визуально перемещает элемент в конец списка, но он по-прежнему имеет 0, что не имеет смысла
Изначально у меня был код

Код: Выделить всё

protected function punctualChart ($attendanceCollection, ?string $puncMode) {

$puncMode = $puncMode?? "ear";
// group them into each day. rank by employee with most days
$attendanceDays = $attendanceCollection->groupBy(function ($attendance) {

return $attendance->created_at->format("m-d");
})
->map(function ($daysCollection) use ($puncMode) { // then sum their value for each day? add their indexes. depending on the mode, we know whether highest or lowest is the winner

return $daysCollection->sort(function ($a, $b) use ($puncMode) {

$date1 = $a->created_at;

$date2 = $b->created_at;

if ($puncMode == "lat") {

if ($b > $a) return 1;

if ($a > $b) return -1;

return 0;
}
else {

if ($a > $b) return 1;

if ($b > $a) return -1;

return 0;
}
});
})->values();
// dd($attendanceDays->get(1), $attendanceDays->get(2), $puncMode);
$scoreEmployee = [];

foreach ($attendanceDays as $attendanceCollection) {

foreach ($attendanceCollection as $index => $attendance) {
dump($index);
$employeeId = /*$attendance->employee->last_name.*/$attendance->employee_id;

if (!array_key_exists($employeeId, $scoreEmployee))

$scoreEmployee[$employeeId] = /*0;*/[

"value" => 0,

"model" => $attendance->employee->last_name
];

$scoreEmployee[$employeeId]["value"] += $index+1; // offset 0-based index
}
}

$sortedEmployeeScores = \Illuminate\Support\Arr::sort($scoreEmployee, "value");
dd($scoreEmployee, $sortedEmployeeScores);
return $scoreEmployee;
}
Впоследствии оно было упрощено до

Код: Выделить всё

protected function punctualChart ($attendanceCollection, ?string $puncMode) {

$puncMode = $puncMode?? "ear";
// group them into each day. rank by employee with most days
$attendanceDays = $attendanceCollection->groupBy(function ($attendance) {

return $attendance->created_at->format("m-d");
})
->map(function ($daysCollection) use ($puncMode) { // then sum their value for each day? add their indexes.  depending on the mode, we know whether highest or lowest is the winner

return $puncMode == "ear"? $daysCollection->sortBy("created_at"):

$daysCollection->sortByDesc("created_at");
})/*->values()*/;
// dd($attendanceDays->get(1), $attendanceDays->get(2), $puncMode);
$scoreEmployee = [];

foreach ($attendanceDays as $attendanceCollection) {

foreach ($attendanceCollection as $index => $attendance) {
dump($index);
$employeeId = /*$attendance->employee->last_name.*/$attendance->employee_id;

if (!array_key_exists($employeeId, $scoreEmployee))

$scoreEmployee[$employeeId] = /*0;*/[

"value" => 0,

"model" => $attendance->employee->last_name
];

$scoreEmployee[$employeeId]["value"] += $index+1; // offset 0-based index
}
}

$sortedEmployeeScores = \Illuminate\Support\Arr::sort($scoreEmployee, "value");
dd($scoreEmployee, $sortedEmployeeScores);
return $scoreEmployee;
}
Откуда я понял, что сортировка не нужна. Забавно, что результаты сортируются автоматически. Однако эта индексация фиксирована и не может быть изменена. В любом случае одни и те же элементы всегда имеют одинаковые индексы. Поэтому я подумал, что, возможно, переворачивание списка поможет, т. е. вместо передачи puncMode я просто переверну массив, чтобы получить обратный результат. Но и это не работает
Так что же я делаю не так и как мне поменять их индексы, чтобы они отражали их позицию? Затем просуммируйте эту позицию для рендеринга на моем графике (эту часть добавлять не нужно. Просто раскрываем для полноты картины)?

Подробнее здесь: https://stackoverflow.com/questions/791 ... ex-by-time
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»