/** * @param array $values * @param ValuesBag $valuesBag * @param ValueComparisonInterface $comparison * @param array $options * @param bool $exclude */ private function removeDuplicateValues(array $values, ValuesBag $valuesBag, ValueComparisonInterface $comparison, array $options, $exclude = false) { foreach ($values as $i => $value) { foreach ($values as $c => $value2) { if ($i === $c || !$comparison->isEqual($value, $value2, $options)) { continue; } if ($exclude) { $valuesBag->removeExcludedSimpleValue($i); } else { $valuesBag->removeSimpleValue($i); } unset($values[$i]); } } }
/** * Removes single values overlapping in ranges. * * For example: 5 overlaps in 1 - 10 * * @param array $singleValues * @param Range[] $ranges * @param ValuesBag $valuesBag * @param ValueComparisonInterface $comparison * @param array $options * @param bool $exclude */ private function removeOverlappingSingleValues(array $singleValues, array $ranges, ValuesBag $valuesBag, ValueComparisonInterface $comparison, array $options, $exclude = false) { foreach ($ranges as $i => $range) { foreach ($singleValues as $c => $value) { if ($this->isValInRange($value, $range, $comparison, $options)) { if ($exclude) { $valuesBag->removeExcludedSimpleValue($c); } else { $valuesBag->removeSimpleValue($c); } } } } }
/** * Converts a list of values to ranges. * * @param array $values * @param ValuesBag $valuesBag * @param FieldConfigInterface $config * @param bool $exclude */ private function listToRanges($values, ValuesBag $valuesBag, FieldConfigInterface $config, $exclude = false) { $class = $exclude ? ExcludedRange::class : Range::class; /** @var ValueIncrementerInterface $comparison */ $comparison = $config->getValueComparison(); $options = $config->getOptions(); $prevIndex = null; $prevValue = null; $rangeLower = null; $rangeUpper = null; $valuesCount = count($values); $curCount = 0; foreach ($values as $valIndex => $value) { ++$curCount; if (null === $prevValue) { $prevIndex = $valIndex; $prevValue = $value; continue; } $unsetIndex = null; $increasedValue = $comparison->getIncrementedValue($prevValue, $options); if ($comparison->isEqual($value, $increasedValue, $options)) { if (null === $rangeLower) { $rangeLower = $prevValue; } $rangeUpper = $value; } if (null !== $rangeUpper) { $unsetIndex = $prevIndex; if ($curCount === $valuesCount || !$comparison->isEqual($value, $increasedValue, $options)) { $range = new $class($rangeLower, $rangeUpper, true, true); $valuesBag->add($range); $unsetIndex = $prevIndex; if ($curCount === $valuesCount) { $unsetIndex = $valIndex; } $rangeLower = $rangeUpper = null; } $prevIndex = $valIndex; $prevValue = $value; } if (null !== $unsetIndex) { if ($exclude) { $valuesBag->removeExcludedSimpleValue($unsetIndex); } else { $valuesBag->removeSimpleValue($unsetIndex); } } } }