Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将数字数组折叠成一系列范围_Php_Arrays - Fatal编程技术网

Php 如何将数字数组折叠成一系列范围

Php 如何将数字数组折叠成一系列范围,php,arrays,Php,Arrays,我有以下数组: $values=array(2000,2001,2002,3000,3001,3002); 我想返回一组数字范围: $ranges=array(2000-2002,3000-3002); 如何做到这一点?我认为使用阵列可能会有更好的解决方案。。。map/reduce/walk函数,但您可以从这个函数开始 $values = [2000, 2001, 2002, 3000, 3001, 3002]; sort($values); $result = []; $start =

我有以下数组:

$values=array(2000,2001,2002,3000,3001,3002);
我想返回一组数字范围:

$ranges=array(2000-2002,3000-3002);

如何做到这一点?

我认为使用阵列可能会有更好的解决方案。。。map/reduce/walk函数,但您可以从这个函数开始

$values = [2000, 2001, 2002, 3000, 3001, 3002];

sort($values);
$result = [];
$start = $prevValue = null;
foreach ($values as value) {
    if ($value - $prevValue > 1) {
        if ($start) {
            $result[] = $start == $prevValue ? $start : $start . '-' . $prevValue;
        }
        $start = $value;
    }
    $prevValue = $value;
}
$result[] = $start == $prevValue ? $start : $start . '-' . $prevValue;
测试数据输出:

[2000,2001,2002,3000,3001,3002] => [2000-2002,3000-3002]
[2000,2001,2002,3000,3001,3002,4000] => [2000-2002,3000-3002,4000]
[] => []
[2000] => [2000]
[4001,2000] => [2000,4001]
[4001,2000,2000] => [2000,4001]
给你:

<?php

function groupArrayHelper(array $values, array $groupArray, callable $isWithinRange) {

    if ( !$values ) {
        return $groupArray;
    }

    $lastValueInGroup = (string)$values[0];

    $group = [ $lastValueInGroup ];

    $length = sizeof( $values );

    for ( $i = 1; $i < $length; $i++ ) {
        $currentValue = $values[$i];

        if ( !$isWithinRange( $currentValue, $lastValueInGroup ) ) {
            break;
        }

        $lastValueInGroup = $currentValue;
    }

    if ( ( $lastValueInGroup - $values[0] ) > 0 ) {
        $group[] = (string)$lastValueInGroup;
    }

    $groupArray[] = implode( $group, '-' );

    $moreValues = array_slice( $values, $i );

    return groupArrayHelper( $moreValues, $groupArray, $isWithinRange );
}

function groupArray(array $values) {

    $values = array_unique( $values );
    sort( $values );

    return groupArrayHelper(
            $values,
            [ ],
            function ($x, $y) {
                return ( 1 == $x - $y );
            }
    );
}

function formatArray(array $values) {
    return sprintf( '[%s]', implode( ',', $values ) );
}

$testValues[] = array( 2000, 2001, 2002, 3000, 3001, 3002 );
$testValues[] = array( 2000, 2001, 2002, 3000, 3001, 3002, 4000 );
$testValues[] = array();
$testValues[] = array( 2000 );
$testValues[] = array( 4001, 2000 );
$testValues[] = array( 4001, 2000, 2000 );

array_map( function ($values) {

    $output = groupArray( $values );

    echo formatArray( $values ) . ' => ' . formatArray( $output ) . PHP_EOL;

}, $testValues );

您的意思是作为字符串范围
$ranges=array(“2000-2002”、“3000-3002”)?是的,作为字符串范围。只有当
$values
数组按升序排序时,您的代码才能工作,这使代码更加出色:)好吧,我的代码适用于给定的任务。不幸的是,作者没有向我们提供很多细节,拒绝回答任何问题。另外,我认为对于未排序的数组,我们必须首先对其进行排序。。。