配列から壊れシリーズをグループ化

ameenulla0007:

私はグループの要件壊れシリーズを持っています。

//Example
$seriesArray = array(1, 2, 3, 5, 7, 8, 11, 12, 15);
//You see numbers are not continuous here.
//Therefore i need to group the above array to seek the below output

予想される出力

Series 1 : from 1 to 3
Series 2 : 5
Series 3 : 7 and 8
Series 4 : 11 and 12
Series 5 : 15

上記の例では、あなたが見ることができる連続性がないように、シリーズ1は、単一の値を示し、(2つの値よりも大きいがあるように)1から3にグループ化され、およびシリーズ2および5されています。直列3及び4で、これは、2つの連続した値と、2つの値を示しています。

私が試してみました

function groupSeries($mainArray, $comboArr=array()) {
   $getRange = range(min($mainArray), max($mainArray)); //Expected Range
   $diffArr  = array_diff($getRange, $mainArray); //Difference of what is expected
   $ranges   = array();
   $initiateKey = 0;
   foreach($diffArr as $indKey=>$indVal) {
      if(!empty($mainArray[$initiateKey])) {
         $ranges[] = range($mainArray[$initiateKey], $getRange[$indKey-1]);
         $initiateKey = $indKey;
      }
   }
   return showRanges($ranges);
}
function showRanges($getRanges) {
   $i = 1;
   foreach($getRanges as $indRange) {
     $arrCount = count($indRange);
     echo "Series $i : ";
     switch($arrCount) {
        case 1 : echo $indRange[0]; break;
        case 2 : echo $indRange[0]." and ".$indRange[1]; break;
        default: echo "From ".min($indRange)." to ".max($indRange); break;
     }
     $i++;
     echo "\n";
   }
}

$seriesArray = array(1, 2, 3, 5, 7, 8, 11, 12, 15);
groupSeries($seriesArray);

アレイの上記一連のように、本出力に失敗しています

Series 1 : From 1 to 3
Series 2 : 5
Series 3 : 8
Series 4 : From 9 to 15

上記の試験では、いくつかのシナリオで動作しますが、多くに失敗しました。

Sougataボーズ:

また、これは動作するはずです -

    $seriesArray = array(1, 2, 3, 5, 7, 8, 11, 12, 15);
    sort($seriesArray); // Sort array if required
    $all = range(min($seriesArray), max($seriesArray)); // get all possibles values in sorted manner
    $temp = array_diff($all, $seriesArray); // get the missing values
    $new = [];
    $i = 1;
    foreach ($temp as $missing) {
        // Group or extract all values present less than or equals to every missing value to get the series
        $new[$i] = array_filter($seriesArray, function($v) use($missing) {
            return $v <= $missing;
        });
        // remove already grouped values
        $seriesArray = array_diff($seriesArray, $new[$i]);
        $i++;
    }
    // merge the remaining values or end values & remove empty values
    $new = array_filter(array_merge($new, [$seriesArray]));

$new あなたが望むように、すべてのグループ化された値を持つことになります、あなたは表すことができます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=342957&siteId=1