首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成字符串范围的算法(1-10,13,16,17-25)。(等)从数字数组

生成字符串范围的算法(1-10,13,16,17-25)。(等)从数字数组
EN

Stack Overflow用户
提问于 2014-04-11 11:06:26
回答 3查看 765关注 0票数 0

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

我一直在研究的代码是:

代码语言:javascript
运行
复制
$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;
}

这就产生了

代码语言:javascript
运行
复制
1-1, 3-3, 2-2, 4-9, 11-11, 10-10, 15-15, 14-14, 13-13, 12-12, 16-20, 22-22

我不希望它显示重复的数字,所以我希望它看起来如下:

代码语言:javascript
运行
复制
1, 3, 2, 4-9, 11, 10, 15, 14, 13, 12, 16-20, 22

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

我相信这将是一个很好的容易的some1,任何帮助都会收到很大的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-11 11:21:14

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

代码语言:javascript
运行
复制
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;
}
票数 2
EN

Stack Overflow用户

发布于 2014-04-11 11:21:54

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

代码语言:javascript
运行
复制
$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;
}
票数 1
EN

Stack Overflow用户

发布于 2014-04-11 11:50:35

我想你是在找这样的东西

代码语言:javascript
运行
复制
<?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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23010876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档