【问题标题】:Reverse range-like functionality in php arraysphp数组中的反向范围功能
【发布时间】:2011-05-30 00:10:15
【问题描述】:


我有一个这样的数组:

array(0, 2, 4, 5, 6, 7, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99);

我想将它作为以下字符串:

0, 2, 4-7, 90+

在我开始拔头发之前有什么例子吗?
谢谢。

更新:
这是我在获取@Andy 的代码并稍作修改后使用的最终解决方案。

function rangeArrayToString($rangeArray, $max = 99) {
    sort($rangeArray);
    $first = $last = null;
    $output = array();

    foreach ($rangeArray as $item) {
        if ($first === null) {
            $first = $last = $item;
        } else if ($last < $item - 1) {
            $output[] = $first == $last ? $first : $first . '-' . $last;
            $first = $last = $item;
        } else {
            $last = $item;
        }
    }

    $finalAddition = $first;

    if ($first != $last) {
        if ($last == $max) {
            $finalAddition .= '+';
        } else {
            $finalAddition .= '-' . $last;
        }
    }

    $output[] = $finalAddition;

    $output = implode(', ', $output);
    return $output;
}

【问题讨论】:

  • Erm... 也许您应该尝试使用一些编程 来解决这个问题?我不是想冒犯你,但如果你稍微动动脑筋,这是一项简单的任务。
  • 我真的不明白,在为用户提问而设计的网站上,怎么还有人像你刚才那样评论 cmets。如果您认为这很简单,您不必回答这个问题,但是告诉我我可以尝试通过编程来做到这一点,根本没有帮助。我喜欢看代码示例。它不拘泥于范式,丰富了我的编码实践。
  • 此站点适用于您遇到代码问题时,而不适用于您不想自己编写代码并希望让其他人为您编写代码的情况。如果您发布了您尝试过但没有成功的东西,那将是完全不同的东西。
  • @Alin,如果您认为我需要其他人来完成我的工作,欢迎您查看我的其他问题。

标签: php arrays numbers range reverse


【解决方案1】:
$first = $last = null;
$output = array();

foreach ($array as $item) {
    if ($first === null) {
        $first = $last = $item;
    } else if ($last < $item - 1) {
        $output[] = $first == $last ? $first : $first . '-' . $last;
        $first = $last = $item;
    } else {
        $last = $item;
    }
}

$output[] = $first == $last ? $first : $first . '+';
$output = join(', ', $output);

【讨论】:

  • 当然是假设数组已经排序,否则先asort()数组
  • 谢谢@Andy。您的代码假定给定数组中的最后一个数字是可能的最大值(对于 + 号)。我添加了一个 $max 变量来设置它,所以如果计数继续达到最大数量,它只会添加 + 号。在我原来的问题中查看我的代码。
  • +1 看到我自己的国产版本与此基本相同,我松了一口气。但你的更干净。
【解决方案2】:
function makeRange($array, $last=array(), $done=array()){
    if ($array == array()) {
        return $done;
    }

    $h = $array[0]; 
    $t = array_slice($array, 1);

    if ($last == array()) {
        $last = array($array[0], $array[0]);
    }
    if ($t[0] == 1 + $last[1]) {
        return makeRange($t, array($last[0], $h+1), $done);
    }
    $done[] = $last;
    return makeRange($t, array(), $done);
}

print_r(makeRange(array(1,2,3,5,6,7, 9, 11,12,13,18)));

// Output 

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 3
        )

    [1] => Array
        (
            [0] => 5
            [1] => 7
        )

    [2] => Array
        (
            [0] => 9
            [1] => 9
        )

    [3] => Array
        (
            [0] => 11
            [1] => 13
        )

    [4] => Array
        (
            [0] => 18
            [1] => 18
        )

)

您可以添加一个简单的装饰器来提供所需的 4-7 而不是 array(4,7)。这个我省略了,因为数据的视图应该是分开的。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多