<?php declare(strict_types=1); /* * This file is part of contao-weinanlieferung-bundle. * * (c) vonRotenberg * * @license commercial */ namespace vonRotenberg\WeinanlieferungBundle\Model; use Contao\Model; class WeinanlieferungStandortModel extends Model { /** * Table name * @var string */ protected static $strTable = 'tl_vr_wa_standort'; /** * Extracts all possible numbers from the number_ranges field. * Expands ranges like "0000-0002" into individual numbers: "0000", "0001", "0002". * * @param array $excludeNumbers Optional array of numbers to exclude from the result * @param int $limit Optional limit to return only a specific number of results * @return array Array of extracted numbers */ public function extractNumbersFromRanges(array $excludeNumbers = [], int $limit = 0): array { $result = []; $ranges = $this->number_ranges; $excludeLookup = array_flip($excludeNumbers); // For faster lookups if (empty($ranges)) { return $result; } // Split by line breaks and other common separators $lines = preg_split('/[\r\n,;]+/', $ranges); foreach ($lines as $line) { $line = trim($line); if (empty($line)) { continue; } // Check if it's a range (contains a hyphen) if (strpos($line, '-') !== false) { list($start, $end) = array_map('trim', explode('-', $line, 2)); // Ensure both start and end are valid if (is_numeric($start) && is_numeric($end)) { // Get the padding length from the start number $padLength = strlen($start); // Convert to integers for the range calculation $startNum = intval($start); $endNum = intval($end); // Generate numbers in the range, but check limit for ($i = $startNum; $i <= $endNum; $i++) { $number = str_pad((string)$i, $padLength, '0', STR_PAD_LEFT); // Skip if this number should be excluded if (isset($excludeLookup[$number])) { continue; } $result[] = $number; // Check if we've reached the limit if ($limit > 0 && count($result) >= $limit) { return $result; } } } else { // If not a valid range, treat as a single number if (!isset($excludeLookup[$line])) { $result[] = $line; // Check if we've reached the limit if ($limit > 0 && count($result) >= $limit) { return $result; } } } } else { // It's a single number if (!isset($excludeLookup[$line])) { $result[] = $line; // Check if we've reached the limit if ($limit > 0 && count($result) >= $limit) { return $result; } } } } return $result; } /** * Returns the count of all possible numbers from the number_ranges field * without actually generating all the numbers. * * @return int Count of all possible numbers */ public function countNumbersInRanges(): int { $count = 0; $ranges = $this->number_ranges; if (empty($ranges)) { return $count; } // Split by line breaks and other common separators $lines = preg_split('/[\r\n,;]+/', $ranges); foreach ($lines as $line) { $line = trim($line); if (empty($line)) { continue; } // Check if it's a range (contains a hyphen) if (strpos($line, '-') !== false) { list($start, $end) = array_map('trim', explode('-', $line, 2)); // Ensure both start and end are valid if (is_numeric($start) && is_numeric($end)) { // Convert to integers for the range calculation $startNum = intval($start); $endNum = intval($end); // Add the count of numbers in this range $count += ($endNum - $startNum + 1); } else { // If not a valid range, count as a single number $count++; } } else { // It's a single number $count++; } } return $count; } }