2016-02-17 18 views
6

Do mojego bieżącego projektu potrzebuję użytkownika do zdefiniowania zakresu liczb, który jest przechowywany w bazie danych.PHP otrzymuje tablicę liczb z łańcucha o zakresie

następujący ciąg jest możliwe wejście użytkownika:

1025-1027,1030,1032-1034 

Chcę przetworzyć ten ciąg z php, aby uzyskać tablicę możliwych liczb łącznie z możliwością dodania zakres numerów z n-n² lub dodawanie pojedynczych numerów oddzielone n; n² który w tym przykładzie będzie:

1025 1026 1027 1030 1032 1031 1034 

Odpowiedz

4

podzielić ciąg wejściowy przecinkiem, a następnie zobaczyć, co każdy element nowej tablicy jest. Jeśli ma ogranicznik zakresu (-), dodać każdą liczbę z przedziału do tablicy:

$input = '1025-1027,1030,1032-1034'; 

$inputArray = explode(',', $input); 
$outputArray = array(); 

foreach($inputArray as $v) { 
    if(strpos($v, '-') === false) { 
     $outputArray[] = $v; 
    } else { 
     $minMax = explode('-',$v); 

     if($minMax[0]<=$minMax[1]) { 
      $outputArray = array_merge($outputArray, range($minMax[0], $minMax[1])); 
     } 
    } 
} 

print_r($outputArray); 

Wartość zwracana w końcu jest

Array 
(
    [0] => 1025 
    [1] => 1026 
    [2] => 1027 
    [3] => 1030 
    [4] => 1032 
    [5] => 1033 
    [6] => 1034 
) 
+0

Dziękuję bardzo. To działa idealnie. –

3

Innym sposobem/wariantu byłoby explode zarówno , i -, a następnie map każda grupa eksplodował następnie użyj range po zakresy został utworzony, przeinstalować grupowanie:

$input = '1025-1027,1030,1032-1034'; 
// explode, map, explode, create range 
$numbers = array_map(function($e){ 
    $range = explode('-', $e); 
    return (count($range) > 1) ? range(min($range), max($range)) : $range; 
}, explode(',', $input)); 
// re merge 
$numbers = call_user_func_array('array_merge', $numbers); 
print_r($numbers);