49 self::IDENTIFIER_TYPE_SOLUTION => array(),
50 self::IDENTIFIER_TYPE_RANDOM => array()
71 $this->objectInstanceId = ++self::$objectInstanceCounter;
82 $this->objectInstanceId = ++self::$objectInstanceCounter;
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) {
499 case self::IDENTIFIER_TYPE_SOLUTION:
500 return self::isValidSolutionIdentifier($identifier);
502 case self::IDENTIFIER_TYPE_RANDOM:
503 return self::isValidRandomIdentifier($identifier);
511 switch ($identifierType) {
512 case self::IDENTIFIER_TYPE_SOLUTION:
515 case self::IDENTIFIER_TYPE_RANDOM:
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) {
596 $nextSolutionIdentifier = $lastSolutionIdentifier + self::SOLUTION_IDENTIFIER_VALUE_INTERVAL;
598 return $nextSolutionIdentifier;
607 $usedTriesCounter = 0;
610 if ($usedTriesCounter >= self::RANDOM_IDENTIFIER_BUILD_MAX_TRIES) {
616 $lowerBound = self::RANDOM_IDENTIFIER_RANGE_LOWER_BOUND;
617 $upperBound = self::RANDOM_IDENTIFIER_RANGE_UPPER_BOUND;
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;
644 return self::isValidSolutionIdentifier($position);
649 return self::isValidPosition($indentation);
657 foreach ($this as $element) {
667 $numIntersectingElements = count(array_intersect(
668 $otherList->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;
__clone()
clone list by additionally cloning the element objects
reorderByRandomIdentifiers($randomIdentifiers)
fetchIdentifier(ilAssOrderingElement $element, string $identifierType)
registerIdentifiers(ilAssOrderingElement $element)
elementExistBySolutionIdentifier($solutionIdentifier)
static isValidPosition($position)
const IDENTIFIER_TYPE_SOLUTION
setRandomIdentifier(int $random_identifier)
const JS_ADDED_ELEMENTS_RANDOM_IDENTIFIER_START_VALUE
static $identifierRegistry
isValidIdentifier($identifierType, $identifier)
PhpInconsistentReturnPointsInspection
getRegisteredSolutionIdentifiers()
getLastSolutionIdentifier()
const SOLUTION_IDENTIFIER_START_VALUE
populateIdentifier(ilAssOrderingElement $element, $identifierType, $identifier)
removeElement(ilAssOrderingElement $removeElement)
const RANDOM_IDENTIFIER_RANGE_UPPER_BOUND
withElements(array $elements)
isFirstElementPosition($position)
completeContentsFromElementList(self $otherList)
elementExistByPosition($position)
moveElementByPositions($currentPosition, $targetPosition)
setQuestionId($question_id)
hasSameElementSetByRandomIdentifiers(self $otherList)
elementExistByRandomIdentifier($randomIdentifier)
static buildInstance(int $question_id, array $elements=[])
getSolutionIdentifierIndex()
getRegisteredRandomIdentifiers()
throwMissingReorderPositionException($randomIdentifier)
resetElements()
resets elements
const JS_ADDED_ELEMENTS_RANDOM_IDENTIFIER_VALUE_INTERVAL
static isValidRandomIdentifier($identifier)
const SOLUTION_IDENTIFIER_VALUE_INTERVAL
throwCouldNotBuildRandomIdentifierException($maxTries)
getRegisteredIdentifiers($identifierType)
distributeNewRandomIdentifiers()
getElementByRandomIdentifier($randomIdentifier)
buildIdentifier($identifierType)
throwUnknownRandomIdentifiersException($randomIdentifiers)
getElementBySolutionIdentifier($solutionIdentifier)
ensureValidIdentifier(ilAssOrderingElement $element, $identifierType)
throwUnknownIdentifierTypeException($identifierType)
addElement(ilAssOrderingElement $element)
getDifferenceRandomIdentifierIndex(self $otherElementList)
getIndexedElements($identifierType)
isIdentifierRegistered(ilAssOrderingElement $element, $identifierType)
getRandomIdentifierIndexedElements()
static getFallbackDefaultElement()
getRandomIdentifierIndex()
const FALLBACK_DEFAULT_ELEMENT_RANDOM_IDENTIFIER
static isValidSolutionIdentifier($identifier)
const RANDOM_IDENTIFIER_RANGE_LOWER_BOUND
const RANDOM_IDENTIFIER_BUILD_MAX_TRIES
resetElementsIndentations()
resets the indentation to level 0 for all elements in list
buildSolutionIdentifier()
setSolutionIdentifier(int $solution_identifier)
getElementByPosition($position)
getParityTrueElementList(self $otherList)
static $objectInstanceCounter
getSolutionIdentifierIndexedElements()
withQuestionId(int $question_id)
__construct(int $question_id=null, array $elements=[])
ilAssOrderingElementList constructor.
static isValidIndentation($indentation)
hasValidIdentifiers(ilAssOrderingElement $element)
isLastElementPosition($position)
ensureValidIdentifiers(ilAssOrderingElement $element)
const IDENTIFIER_TYPE_RANDOM
registerIdentifier(ilAssOrderingElement $element, $identifierType)
const SOLUTION_IDENTIFIER_BUILD_MAX_TRIES
getDifferenceElementList(self $otherElementList)