Импортировать отсортированный массив чисел в строку через запятую и интервалы слияния

Я хотел бы взорвать массив, но с одним отличием. Я хотел бы объединить интервалы с знаком - . Как это может быть сделано? (Массив упорядочен!)

Примеры:

 array(1,2,3,6,8,9) => "1-3,6,8-9" array(2,4,5,6,8,10) => "2,4-6,8,10" 

Это должно сработать для вас:

Сначала для каждой итерации мы просто добавляем текущее число итераций в строку $result :

 $result .= $arr[$i]; 

После этого мы проверяем цикл while, если в массиве (1) существует следующий элемент, и он следует за номером из текущей итерации (2). Мы делаем это до тех пор, пока условие не примет значение false:

 //(1)Check if next element exists (2)Check if next element follows up the prev one ┌───────┴───────┐ ┌───────────┴────────────┐ while(isset($arr[$i+1]) && $arr[$i] + 1 == $arr[$i+1] && ++$range) $i++; 

Затем мы проверяем, есть ли диапазон (например, 1-3 ) или нет. Если да, то добавим тире и конечный номер диапазона в строку результата:

 if($range) $result .= "-" . $arr[$i]; 

В конце мы также проверяем, находимся ли мы в конце массива и больше не нужно добавлять запятую:

 if($i+1 < $l) $result .= ","; 

Код:

 <?php $arr = array(1,2,3,6,8,9); $result = ""; $range = 0; for($i = 0, $l = count($arr); $i < $l; $i++){ $result .= $arr[$i]; while(isset($arr[$i+1]) && $arr[$i] + 1 == $arr[$i+1] && ++$range) $i++; if($range) $result .= "-" . $arr[$i]; if($i+1 < $l) $result .= ","; $range = 0; } echo $result; ?> 

вывод:

 1-3,6,8-9 
  $oldArray=array(2,4,5,6,8,10); $newArray=array(); foreach($oldArray as $count=>$val){ if($count==0){ //begin sequencing $sequenceStart=$sequenceEnd=$val; } if($val==$sequenceEnd+1){ $sequenceEnd=$val; continue; }else{ if($sequenceEnd==$val){ //do nothing continue; } } //new sequence begins //save new sequence if($sequenceStart==$sequenceEnd){ //sequnce is a single number $newArray[]=$sequenceEnd; }else{ $newArray[]=$sequenceStart.'-'.$sequenceEnd; } //reset sequence $sequenceStart=$sequenceEnd=$val; } //new sequence begins //save new sequence if($sequenceStart==$sequenceEnd){ //sequnce is a single number $newArray[]=$sequenceEnd; }else{ $newArray[]=$sequenceStart.'-'.$sequenceEnd; } //reset sequence $sequenceStart=$sequenceEnd=$val; return implode(',', $newArray); 

Нет такой функции, поэтому вам нужно будет создать ее самостоятельно. Я просто создал примерную функцию, как это может выглядеть, для этого существует много возможных решений (не пытались, если это действительно работает, поскольку у меня нет веб-сервера в достижении atm)

 <?php function implodeNumberArray($arr) { $lastValue = NULL; $o = ""; //For each value in array foreach ($arr as $v) { if(!is_null($lastValue)) { //If the number is following, do not paste it if(($lastValue+1) == $v) { //Check if the - sign was already posted if(!(stripos(strrev($o), '-') === 0)) { // - sign not pasted, therefore paste it $o .= "-"; } } else { //Check if there is a - sign at the end if((stripos(strrev($o), '-') === 0)) { // Has - => paste 'prevValue,value'' $o .= $lastValue . "," . $v; } else { //Check if there is a , sign at the end if((stripos(strrev($o), ',') === 0)) { // No - but , => paste 'value' $o .= $v; } else { // No - and no , => paste ',value' $o .= ",".$v; } } } } else { $o = $v; } $lastValue = $v; } //Check if the implode has the last number set correctly if((stripos(strrev($o), '-') === 0)) { $o .= $lastValue; } return $o; } echo implodeNumberArray(array(1,2,3,6,8,9)); ?>