Как сделать последовательность массивов?

Привет всем...

есть массив чисел:

$myArray[0] = 1;
$myArray[1] = 2;
$myArray[2] = 3;
$myArray[3] = 4;
$myArray[4] = 6;
$myArray[5] = 7;
$myArray[6] = 8;
$myArray[7] = 10;
$myArray[8] = 11;
$myArray[9] = 13;
$myArray[10] = 14;
$myArray[11] = 15;
$myArray[12] = 17;
$myArray[13] = 19;


Нужно вывести эти числа в след. виде:
"1-4,6-8,10-11,13-15,17,19"

Не поможете как на php это сделать? А то уже второй день голову ломаю.
  • Вопрос задан
  • 2466 просмотров
Решения вопроса 2
DevMan
@DevMan
как-то так:
$str = '';
$isRange = false;
for( $i = 0, $length = count( $myArray ); $i < $length; $i++ ) {
	if( isset($myArray[ $i + 1 ] ) ) {
		if( $myArray[ $i + 1 ] == $myArray[ $i ] + 1 ) {
			if( $isRange ) {
				continue;
			}
			$str .= $myArray[ $i ] . '-';
			$isRange = true;
		}
		else {
			$isRange = false;
			$str .= $myArray[ $i ] . ',';
		}
	}
	else {
		$str .= $myArray[ $i ];
	}
}
echo $str;
Ответ написан
thewind
@thewind
php программист, front / backend developer
Вот что у меня получилось, через разницу между числами и количеством пройденных элементов

$myArray = Array(1,2,3,4,6,7,8,10,11,13,14,15,17,19);
	
	$num = current($myArray);
	$difference = $elements = 0;
	$result = Array();
	
	foreach ($myArray as $k=>$v) {
		$prev = $k>0 ? $myArray[$k-1] : 0;
		$difference += $v - $prev;
		$elements++;
		
		if ($difference > $elements) {
			$result[] = $num . ($elements>1 && $prev ? '-' . $prev : '');
			$num = $v;
			$difference = $elements = 0;
		}
	}
	
	// также добавить последний элемент или разницу между ним и последним запомненным
	$result[] = $num . ($elements>1 && $v ? '-' . $v : '');
	
	echo implode(',', $result);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
"1-4,6-8,10-11,13-15,17,19"

какая тут последовательность, поясни.
Ответ написан
saksmt
@saksmt
PHP-developer, Backend
Дмитрий, узнал, что упёр вашу идею после того, как написал :)
<?php

function extractIntervals(array $data) {
	$result = [array_shift($data)];
	array_walk($data, function ($element) use (&$result) {
		$i = count($result) - 1;
		$j = count($result[$i]) - 1;
		$diff = $element - $result[$i][$j];
		if ($diff > 1) {
			$result[$i][] = $element;
		} else {
			$result[] = [$element];
		}
	});
	return $result;
}

function extractStringIntervals(array $data) {
	return implode(', ', array_map(function (array $interval) {
		$first = $interval[0];
		$last = $interval[count($interval) - 1];
		return $first == $last ? $first : ($first . '-' . $last);
	}, extractIntervals($data)));
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы