2016-02-17 16 views
6

Đối với dự án hiện tại của tôi, tôi cần một người dùng để xác định phạm vi số được lưu trữ trong cơ sở dữ liệu.PHP nhận được một dãy số từ chuỗi với phạm vi

Chuỗi Sau đây là một đầu vào người sử dụng có thể:

1025-1027,1030,1032-1034 

Tôi muốn để xử lý chuỗi này với php để có được một mảng các số có thể bao gồm cả khả năng thêm một dải số với n-n² hoặc thêm số đơn được tách riêng với n; n² cho ví dụ này sẽ là:

1025 1026 1027 1030 1032 1031 1034 

Trả lời

4

Tách chuỗi đầu vào bằng dấu phẩy và sau đó xem mỗi phần tử của mảng mới là gì. Nếu nó có delimiter phạm vi (-), thêm mỗi số từ cự ly để mảng:

$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); 

Giá trị trả lại cuối cùng là

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

Cảm ơn rất nhiều. Điều này hoạt động hoàn hảo. –

3

Một cách khác/biến thể sẽ được explode cả ,-, sau đó bản đồ mỗi nhóm đã phát nổ sau đó sử dụng range, sau những rặng đã được tạo ra, remerge các nhóm:

$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); 
Các vấn đề liên quan