生成字符串范围的算法(1-10、13、16、17-25.等等)


Algorithm to generate string range (1-10, 13, 16, 17-25.. etc) from array of numbers

我正在尝试计算数组中存在的数字的页面范围。我确实试过在谷歌上搜索,但我只找到了不相关的帖子/页面。

我一直在研究的代码是:

$numbers = array(1,3,2,4,5,6,7,8,9,11,10,15,14,13,12,16,17,18,19,20,22);
function get_number_ranges($numbers)
{
    $last = null;
    foreach ($numbers as $number) {
        if (is_null($last)) {
            $string = $number;
            $last = $number;
        } elseif ($last + 1 != $number) {
            $string .= '-' . $last . ', ' . $number;
            $last = $number;
        } else {
            $last = $number;
        }
    }
    if ($last == $number) {
        $string .= '-' . $number;
    }
    return $string;
}

并且产生

1-1, 3-3, 2-2, 4-9, 11-11, 10-10, 15-15, 14-14, 13-13, 12-12, 16-20, 22-22

我不希望它显示重复的号码,所以我希望它看起来像这样:

1, 3, 2, 4-9, 11, 10, 15, 14, 13, 12, 16-20, 22

这样我就可以在存储文档历史记录时表示页面范围。

我相信这对某些人来说会是一个很容易的过程,任何帮助都会得到极大的帮助!

基本上,您需要记住每个范围的第一个数字,当您添加连字符和最后一个数字时,只有当最后一个数值不同时才这样做。类似(未经测试):

function get_number_ranges($numbers)
{
    $last = null;
    foreach ($numbers as $number) {
        if (is_null($last)) {
            $string = $number;
            $last = $number;
            $first = $number ;                          //Remember first
        } elseif ($last + 1 != $number) {
            if ($first != $last )                       //Only append if different
                $string .= '-' . $last ;
            $string .= ', ' . $number;
            $last = $number;
            $first = $number ;                          //Remember first
        } else {
            $last = $number;
        }
    }
    if ($last == $number && $last != $first) {          //Only if different
        $string .= '-' . $number;
    }
    return $string;
}

添加一个变量以保存范围的第一个数字。如果最后一个数字等于第一个数字,那么它就不是一个范围,不需要"-XX"。

$numbers = array(1,3,2,4,5,6,7,8,9,11,10,15,14,13,12,16,17,18,19,20,22);
function get_number_ranges($numbers)
{
    $last = null;
    $firstFromRange = null;
    foreach ($numbers as $number) {
        if (is_null($last)) {
            $string = $number;
            $firstFromRange = $number; // new range begins, save the number
        } elseif ($last + 1 != $number) {
            if ($firstFromRange == $last) { // if the range is only one number, don't add '-' . $last
                $string .= ', ' . $number;
            } else {
                $string .= '-' . $last . ', ' . $number;
            }
            $firstFromRange = $number; // new range begins, save the number
        }
        $last = $number;
    }
    if ($last == $number && $last != $firstFromRange) {
        $string .= '-' . $number;
    }
    return $string;
}

我想你正在寻找类似的东西

<?php
$numbers = array(1,3,2,4,5,6,7,8,9,11,10,15,14,13,12,16,17,18,19,20,22);
function get_number_ranges($numbers){
    $result = '';
    if( is_array($numbers) ){
        $start = $end = array_shift($numbers);
        for($i=0,$c=count($numbers);$i<$c;$i++){
            if($end == $numbers[$i]-1){
                $end = $numbers[$i];
            }else{
                $result .= ($start == $end) ? $start: $start.'-'.$end;
                $result .= ',';
                $start = $end = $numbers[$i];
            }
        }
        $result .= ($start == $end) ? $start: $start.'-'.$end;
    }
    return $result;
}
echo get_number_ranges($numbers );

查看代码板结果http://codepad.org/l1JUSVJO