49 self::IDENTIFIER_TYPE_SOLUTION => array(),
50 self::IDENTIFIER_TYPE_RANDOM => array()
86 foreach ($this as
$key => $element) {
120 return count($this->elements);
130 return $position == 0;
143 $elementList =
new self();
146 foreach ($this as $element) {
147 if ($element->getPosition() == $currentPosition) {
148 $elementList->addElement($dodgingElement);
152 if ($element->getPosition() == $targetPosition) {
153 $elementList->addElement($movingElement);
157 $elementList->addElement($element);
160 $dodgingElement->setPosition($currentPosition);
161 $movingElement->setPosition($targetPosition);
168 $elementList =
new self();
171 $positionCounter = 0;
173 foreach ($this as $element) {
174 if ($element->isSameElement($removeElement)) {
178 $element->setPosition($positionCounter++);
179 $elementList->addElement($element);
188 $this->elements = array();
250 foreach ($this as $element) {
266 $this->elements[] = $element;
275 if (isset($this->elements[$position])) {
276 return $this->elements[$position];
297 foreach ($this as $element) {
298 if ($element->getRandomIdentifier() === intval($randomIdentifier)) {
321 foreach ($this as $element) {
322 if ($element->getSolutionIdentifier() != $solutionIdentifier) {
362 if (!isset(self::$identifierRegistry[$identifierType][$this->
getQuestionId()])) {
366 return self::$identifierRegistry[$identifierType][$this->
getQuestionId()];
375 $identifier = $this->
fetchIdentifier($element, self::IDENTIFIER_TYPE_SOLUTION);
381 $identifier = $this->
fetchIdentifier($element, self::IDENTIFIER_TYPE_RANDOM);
432 if (!isset(self::$identifierRegistry[$identifierType][$this->
getQuestionId()])) {
433 self::$identifierRegistry[$identifierType][$this->
getQuestionId()] = array();
438 if (!in_array($identifier, self::$identifierRegistry[$identifierType][$this->
getQuestionId()])) {
439 self::$identifierRegistry[$identifierType][$this->
getQuestionId()][] = $identifier;
451 if (!isset(self::$identifierRegistry[$identifierType][$this->
getQuestionId()])) {
457 if (!in_array($identifier, self::$identifierRegistry[$identifierType][$this->
getQuestionId()])) {
469 if ($identifierType == self::IDENTIFIER_TYPE_SOLUTION) {
486 switch ($identifierType) {
498 switch ($identifierType) {
511 switch ($identifierType) {
529 "unknown identifier type given (type: $identifierType)"
540 "could not build random identifier (max tries: $maxTries)"
551 "cannot reorder element due to missing position (random identifier: $randomIdentifier)"
562 'cannot reorder element due to one or more unknown random identifiers ' .
563 '(' . implode(
', ', $randomIdentifiers) .
')'
572 $lastSolutionIdentifier =
null;
575 if ($lastSolutionIdentifier > $registeredIdentifier) {
579 $lastSolutionIdentifier = $registeredIdentifier;
582 return $lastSolutionIdentifier;
592 if ($lastSolutionIdentifier ===
null) {
598 return $nextSolutionIdentifier;
607 $usedTriesCounter = 0;
610 if ($usedTriesCounter >= self::RANDOM_IDENTIFIER_BUILD_MAX_TRIES) {
618 $randomIdentifier = mt_rand($lowerBound, $upperBound);
621 $testElement->setRandomIdentifier($randomIdentifier);
624 return $randomIdentifier;
629 return is_numeric($identifier)
630 && $identifier == (
int) $identifier
631 && (
int) $identifier >= 0;
636 return is_numeric($identifier)
637 && $identifier == (
int) $identifier
638 && (
int) $identifier >= self::RANDOM_IDENTIFIER_RANGE_LOWER_BOUND
639 && (
int) $identifier <= self::RANDOM_IDENTIFIER_RANGE_UPPER_BOUND;
657 foreach ($this as $element) {
667 $numIntersectingElements = count(array_intersect(
668 $otherList->getRandomIdentifierIndex(),
669 $this->getRandomIdentifierIndex()
673 && $numIntersectingElements == $otherList->countElements();
682 $parityTrueElementList =
new self();
683 $parityTrueElementList->setQuestionId($this->
getQuestionId());
685 foreach ($this as $thisElement) {
686 $otherElement = $otherList->getElementByRandomIdentifier(
687 $thisElement->getRandomIdentifier()
690 if ($otherElement->getPosition() != $thisElement->getPosition()) {
694 if ($otherElement->getIndentation() != $thisElement->getIndentation()) {
698 $parityTrueElementList->addElement($thisElement);
701 return $parityTrueElementList;
710 $positionsMap = array_flip(array_values($randomIdentifiers));
712 $orderedElements = array();
714 foreach ($this as $element) {
715 if (!isset($positionsMap[$element->getRandomIdentifier()])) {
719 $position = $positionsMap[$element->getRandomIdentifier()];
720 unset($positionsMap[$element->getRandomIdentifier()]);
722 $element->setPosition($position);
723 $orderedElements[$position] = $element;
726 if (count($positionsMap)) {
730 ksort($orderedElements);
732 $this->
setElements(array_values($orderedElements));
740 foreach ($this as $element) {
741 $element->setIndentation(0);
753 $differenceElementList =
new self();
754 $differenceElementList->setQuestionId($this->
getQuestionId());
756 foreach ($differenceRandomIdentifierIndex as $randomIdentifier) {
758 $differenceElementList->addElement($element);
761 return $differenceElementList;
770 $differenceRandomIdentifierIndex = array_diff(
772 $otherElementList->getRandomIdentifierIndex()
775 return $differenceRandomIdentifierIndex;
783 foreach ($this as $thisElement) {
784 if (!$otherList->elementExistByRandomIdentifier($thisElement->getRandomIdentifier())) {
788 $otherElement = $otherList->getElementByRandomIdentifier(
789 $thisElement->getRandomIdentifier()
792 $thisElement->setContent($otherElement->getContent());
801 return current($this->elements);
809 return next($this->elements);
817 return key($this->elements);
825 return ($this->
key() !==
null);
833 return reset($this->elements);
842 $element->setRandomIdentifier(self::FALLBACK_DEFAULT_ELEMENT_RANDOM_IDENTIFIER);
850 $elementList =
new self();
862 foreach ($this as $element) {
863 $items[] = implode(
':', array(
864 $element->getSolutionIdentifier(),
865 $element->getRandomIdentifier(),
866 $element->getIndentation()
870 return md5(serialize($items));
878 $clone = clone $this;
885 $clone = clone $this;
const IDENTIFIER_TYPE_SOLUTION
isIdentifierRegistered(ilAssOrderingElement $element, $identifierType)
hasSameElementSetByRandomIdentifiers(self $otherList)
const RANDOM_IDENTIFIER_RANGE_LOWER_BOUND
completeContentsFromElementList(self $otherList)
fetchIdentifier(ilAssOrderingElement $element, string $identifierType)
distributeNewRandomIdentifiers()
static isValidPosition($position)
registerIdentifiers(ilAssOrderingElement $element)
getLastSolutionIdentifier()
const SOLUTION_IDENTIFIER_START_VALUE
elementExistBySolutionIdentifier($solutionIdentifier)
getDifferenceElementList(self $otherElementList)
const SOLUTION_IDENTIFIER_BUILD_MAX_TRIES
static buildInstance(int $question_id, array $elements=[])
getElementBySolutionIdentifier($solutionIdentifier)
registerIdentifier(ilAssOrderingElement $element, $identifierType)
getIndexedElements($identifierType)
withQuestionId(int $question_id)
const JS_ADDED_ELEMENTS_RANDOM_IDENTIFIER_START_VALUE
getElementByPosition($position)
static $identifierRegistry
static $objectInstanceCounter
static isValidRandomIdentifier($identifier)
getRegisteredRandomIdentifiers()
getRegisteredSolutionIdentifiers()
static getFallbackDefaultElement()
resetElements()
resets elements
isLastElementPosition($position)
getRandomIdentifierIndexedElements()
getSolutionIdentifierIndex()
getSolutionIdentifierIndexedElements()
getDifferenceRandomIdentifierIndex(self $otherElementList)
throwMissingReorderPositionException($randomIdentifier)
populateIdentifier(ilAssOrderingElement $element, $identifierType, $identifier)
getRegisteredIdentifiers($identifierType)
getElementByRandomIdentifier($randomIdentifier)
const SOLUTION_IDENTIFIER_VALUE_INTERVAL
elementExistByRandomIdentifier($randomIdentifier)
getRandomIdentifierIndex()
buildSolutionIdentifier()
removeElement(ilAssOrderingElement $removeElement)
getParityTrueElementList(self $otherList)
isValidIdentifier($identifierType, $identifier)
@noinspection PhpInconsistentReturnPointsInspection
hasValidIdentifiers(ilAssOrderingElement $element)
const RANDOM_IDENTIFIER_RANGE_UPPER_BOUND
withElements(array $elements)
ensureValidIdentifiers(ilAssOrderingElement $element)
const FALLBACK_DEFAULT_ELEMENT_RANDOM_IDENTIFIER
const RANDOM_IDENTIFIER_BUILD_MAX_TRIES
static isValidSolutionIdentifier($identifier)
__construct(int $question_id=null, array $elements=[])
ilAssOrderingElementList constructor.
static isValidIndentation($indentation)
reorderByRandomIdentifiers($randomIdentifiers)
const IDENTIFIER_TYPE_RANDOM
throwCouldNotBuildRandomIdentifierException($maxTries)
moveElementByPositions($currentPosition, $targetPosition)
addElement(ilAssOrderingElement $element)
__clone()
clone list by additionally cloning the element objects
const JS_ADDED_ELEMENTS_RANDOM_IDENTIFIER_VALUE_INTERVAL
buildIdentifier($identifierType)
setQuestionId($question_id)
throwUnknownIdentifierTypeException($identifierType)
elementExistByPosition($position)
isFirstElementPosition($position)
ensureValidIdentifier(ilAssOrderingElement $element, $identifierType)
throwUnknownRandomIdentifiersException($randomIdentifiers)
resetElementsIndentations()
resets the indentation to level 0 for all elements in list
setRandomIdentifier(int $random_identifier)
setSolutionIdentifier(int $solution_identifier)