Nasıl aralıkları listelerini azaltmak?

0 Cevap php

Given a list of ranges ie: 1-3,5,6-4,31,9,19,10,25-20 how can i reduce it to 1-6,9-10,19-25,31 ?

Here is what i've done so far, it seems a little bit complicated, so is there any simpler/clever method to do this.

$in = '1-3,5,6-4,31,9,19,10,25-20';
// Explode the list in ranges
$rs = explode(',', $in);
$tmp = array();
// for each range of the list
foreach($rs as $r) {
    // find the start and end date of the range
    if (preg_match('/(\d+)-(\d+)/', $r, $m)) {
        $start = $m[1];
        $end = $m[2];
    } else {
        // If only one date
        $start = $end = $r;
    }
    // flag each date in an array
    foreach(range($start,$end) as $i) {
        $tmp[$i] = 1;
    }
}
$str = '';
$prev = 999;
// for each date of a month (1-31)
for($i=1; $i<32; $i++) {
    // is this date flaged ?
    if (isset($tmp[$i])) {
        // is output string empty ?
        if ($str == '') {
            $str = $i;
        } else {
            // if the previous date is less than the current minus 1
            if ($i-1 > $prev) {
                // build the new range
                $str .= '-'.$prev.','.$i;
            }
        }
        $prev = $i;
    }
}
// build the last range
if ($i-1 > $prev) {
    $str .= '-'.$prev;
}
echo "str=$str\n";

NB: Bu (i yükseltmek değil) php 5.1.6 altında çalışması gerekir.

Bilginize: Onlar 1-31 sınırlıdır böylece sayıları ayın günlerini temsil eder.

Edit:

Tarihleri ​​belirli bir mesafeden (1-3,6,7-8), I (1-3,6-8) tüm aralıkları hesaplanır ve sipariş nerede başka bir liste edinmek istiyorum.

0 Cevap