19declare(strict_types=1);
38 array $user_questions,
39 private array $user_attempts,
40 private array $question_properties
42 foreach ($user_questions as $uid => $qids) {
43 $this->positions[] = [[$uid], $qids];
49 return $this->
applyMode($mode, $this->positions);
54 return $this->question_properties;
59 return $this->user_attempts;
66 foreach ($filters as $filter) {
68 fn($set) => $filter(...$set),
74 fn($set) => $set[0] !== [] && $set[1] !== []
96 $reordered_positions = array_reduce(
98 static function (array
$c, ?array $v): array {
100 if ($qids ===
null) {
103 foreach ($qids as $qid) {
104 $c[] = [$uids, [$qid]];
111 if ($reordered_positions === []) {
116 usort($reordered_positions,
static fn(
$a,
$b) =>
$a[1][0] <=>
$b[1][0]);
119 return $reordered_positions;
128 $questions2users = array_reduce(
130 static function (array
$c, ?array $v): array {
132 if ($qids ===
null) {
135 foreach ($qids as $qid) {
136 if (!array_key_exists($qid,
$c)) {
139 $c[$qid] = array_unique(array_merge(
$c[$qid], $uids));
146 $reorderd_positions = [];
147 foreach ($questions2users as $qid => $uids) {
148 $reorderd_positions[] = [$uids, [$qid]];
151 if ($reorderd_positions === []) {
155 return $reorderd_positions;
applyMode(ConsecutiveScoringMode $mode, array $positions)
getAllQuestionProperties()
buildAllPositionsList(ConsecutiveScoringMode $mode, array $positions)
applyFilters(\Closure ... $filters)
array $positions
"position" is a set of two arrays [[$user_id(s)], [$question_id(s)]], where - according to transposit...
__construct(array $user_questions, private array $user_attempts, private array $question_properties)
buildSingleModePositionsList(ConsecutiveScoringMode $mode, array $positions)
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples