Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.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,因此,我有一个整数数组:,我想以这种格式将其连接在一起: 我是PHP新手,尝试通过循环数组来实现这一点: function pasteTogether($val) { $newVals = array(); $min = $val[0]; $max = $val[1]; $counter = 0; for ($i = 0; $i < count($val); $i++) {

因此,我有一个整数数组:
,我想以这种格式将其连接在一起:

我是PHP新手,尝试通过循环数组来实现这一点:

function pasteTogether($val)
    {
        $newVals = array();
        $min = $val[0];
        $max = $val[1];
        $counter = 0;
        for ($i = 0; $i < count($val); $i++)
        {
            if ($val[$i + 1] === $val[$i] + 1)
            {
                $max = $val[$i + 1];
            }
            else
            {
                $tempVal = $min."-".$max;
                $newVals[$counter] = $tempVal;
                $counter++;
                $min = $val[$i];
            }
        }
        return $newVals;
    }
函数粘贴在一起($val)
{
$newVals=array();
$min=$val[0];
$max=$val[1];
$counter=0;
对于($i=0;$i

然而,当我运行这段代码时,我得到了PHP致命错误:第36行的../learning.PHP中超过了30秒的最大执行时间

因为for循环永远不会结束,所以您会增加$val而不是$i

$array = array(1, 2, 3, 9, 10, 11, 14);


function pasteTogether($val)
{
    $newVals = array();
    $min = $val[0];
    $max = $val[1];
    $counter = 0;
    for ($i = 0; $i < count($val); $i++)
    {
        if ($val[$i + 1] === $val[$i] + 1)
        {
            $max = $val[$i + 1];
        }
        else
        {
            $tempVal = $min."-".$max;
            $newVals[$counter] = $tempVal;
            $counter++;
            $min = $val[$i];
        }
    }
    return $newVals;
}

pasteTogether($array);
$array=array(1,2,3,9,10,11,14);
函数粘贴在一起($val)
{
$newVals=array();
$min=$val[0];
$max=$val[1];
$counter=0;
对于($i=0;$i
我一直在研究这个有趣的问题,并找到了另一个解决方案。因此,如果有人感兴趣:

$arr=array(1, 2, 3, 9, 10, 11, 14, 15, 16, 18);
$v0=$dif=null;$rows=array();

foreach ($arr as $i => $v) {
 if ($dif!=($d=($v-$i))){
   if ($v0) $rows[]="$v0-".$arr[$i-1];
   $v0=$v;
   $dif=$d;
 }
}
$rows[]="$v0-".($d==$dif?$arr[$i]:$v0);

print_r($rows);
我在数组中添加了一些数字,结果如下:

$rows = Array
(
    [0] => 1-3
    [1] => 9-11
    [2] => 14-16
    [3] => 18-18
)
您可以在这里找到一个小演示:

这很有效:

function pasteTogether($val)
{
    $compacted = [];
    $min       = null;
    $max       = null;

    $format = function ($a, $b) {
        return ($a < $b ? "$a-$b" : $a);
    };

    foreach ($val as $current) {
        if ($min === null) {
            $min = $current;
            $max = $current - 1;
        }

        if ($current == $max + 1) {
            $max++;
        } else {
            $compacted[] = $format($min, $max);
            $min         = $current;
            $max         = $current;
        }
    }

    $compacted[] = $format($min, $max);

    return $compacted;
}

echo '<', implode(', ', pasteTogether([1, 2, 3, 9, 10, 11, 14])), '>';
函数粘贴在一起($val)
{
美元=[];
$min=null;
$max=null;
$format=函数($a,$b){
回报($a<$b?$a-$b):$a);
};
foreach($val作为$current){
如果($min==null){
$min=$current;
$max=$current-1;
}
如果($current==$max+1){
$max++;
}否则{
$compressed[]=$format($min,$max);
$min=$current;
$max=$current;
}
}
$compressed[]=$format($min,$max);
返回$1;
}
回声';
输出:

对我来说,输出是这样的:
注意:未定义的偏移量:第10行的/var/www/html/ehm.php中的7
print\r
给出了这样的结果:
数组([0]=>1-3[1]=>3-11[2]=>11-11)
忘记添加了,这是在修复迭代器之后(你增加
$val
而不是
$i
)哇,我真是个傻瓜。嗯,我想我还有一些工作要做,因为输出不太正确。那个$val的事是个愚蠢的错误。谢谢