PHP检查范围内的空白点

时间:2013-12-02 23:12:35

标签: php php-5.3

是否可以在带有范围的数组中找到空范围,例如:

$ranges = array (
'1000-2000',
'2050-5000',
'5050-9990'
)

作为输出,它需要像:

$notInRanges = array (
'2001-2049',
'5001-5049'
);

范围从1000到9999.太糟糕了我无法完成它并且可以解决它。

我确实得到了PHP代码来填充一个包含所有填充项的数组,并且确实获得了一个未填充范围的数组:

foreach ($ranges as $range) :
    $rangeParts = explode('-', $range);

    for($i=$range[0];$range[1] > $i;$++) :
        $rangeItems[] = $i;
    endfor;
endforeach;

for($i=1000;$i<=9999;$i++) :
    if (!in_array($i, $rangeItems)) :
        $notInRanges[] = $i;
    endif;
endfor;

但是无法弄清楚如何使它像['2001-2049'],['5001-5049']这样的数组或者这样做。

4 个答案:

答案 0 :(得分:3)

啊,无论如何,我很无聊:

define('MIN_RANGE', 1000);
define('MAX_RANGE', 10000);

$ranges = [
  '1000-2000',
  '2050-5000',
  '5050-9990'
];

$filled = [];
foreach($ranges as $range) {
  list($from, $to) = explode('-', $range);
  $filled = array_merge($filled, range($from, $to));
}
$filled = array_flip($filled);
$notInRange = [];
for($i = MIN_RANGE; $i < MAX_RANGE; $i++)
{
  if(!isset($filled[$i]))
  {
    $beginRange = $i;
    for($i = $i+1; $i <= MAX_RANGE; $i++)
    {
      if(isset($filled[$i]) || $i >= MAX_RANGE)
      {
        $notInRange[] = $beginRange.'-'.($i-1);
        break;
      }
    }
  }
}
var_dump($notInRange);

按预期输出:

array (size=3)
  0 => string '2001-2049' (length=9)
  1 => string '5001-5049' (length=9)
  2 => string '9991-9999' (length=9)

答案 1 :(得分:1)

$ranges = array (
    '1000-2000',
    '2050-5000',
    '5050-9990'
);

foreach($ranges as $k=>$range)
    if ($k>0)
        if ((int)substr($range, 0, strpos($range, '-')) <> (int)substr($ranges[$k-1], strpos($ranges[$k-1], '-')+1)+1)
            $gaps[] = ((int)substr($ranges[$k-1], strpos($ranges[$k-1], '-')+1)+1) . '-' . ((int)substr($range, 0, strpos($range, '-'))-1);

print_r($gaps);

答案 2 :(得分:0)

我不会给你一个完整的代码,但是下面应该可以帮助你开始

  1. 对数组进行排序
  2. 使用foreach遍历数组并检查起始位置是否为最后结束位置+ 1,如果没有找到间隙

答案 3 :(得分:0)

$ranges = array (
'1000-2000',
'2050-5000',
'5050-9990'
);
$extremes=range(1000,9990);

$existing=array();
foreach ($ranges as $range){
    list($min, $max)=explode('-', $range);
    $existing=array_merge($existing, range($min, $max));
}

$missing=array_diff($extremes, $existing);
//print_r($missing);

$missing_chunks=array();
$chunks=0;
foreach ($missing as $m){
    if (!isset($missing_chunks[$chunks])) $missing_chunks[$chunks]=array('max'=>$m);
    if ($missing_chunks[$chunks]['max']==$m-1) $missing_chunks[$chunks]['max']=$m;
    else {
        $chunks++;
        $missing_chunks[$chunks]=array('min'=>$m, 'max'=>$m);
    }
}

print_r($missing_chunks);

结果$ missing_chunks不完美而且很慢