Задать вопрос
Omnicake
@Omnicake
Начинающий web-разработчик.

Как решить задачку с массивами на PHP?

Добрый день. Решаю одну задачку по PHP, цель задачки - создание функции, которая получив на вход массив, возвращает массив линейно возрастающих чисел в виде строк "min -> max".

Предварительно написал решение на JS, которое работает https://playcode.io/327606?tabs=console&script.js&... (так просто дебажить проще). Но когда переделал тоже самое под PHP то на выходе получаю пустой массив. Есть подозрение, что где-то в коде обращаюсь к несуществующей переменной, которую JS умеет проглатывать, a PHP нет. В чём может быть проблема?

Сам код решения вот:
function summaryRanges($arr) {
    //Проверяю, если массив пустой или из одного элемента то возвращаю пустой массив
    if(count($arr) === 1 || count($arr) === 0) { 
        return [];
    }

    $copyArr = $arr; //Копия массива, чтобы не кромсать исходный
    $chunk = []; //Массив под кусок диапазона
    $chunkGroup = []; //Массив под группу кусков диапазона
    $result = []; //Результирующий массив

    //Перебираю массив
    for($i = 0; $i < count($copyArr); $i++) { 
    //Проверяю, есть ли элемент i+1, если нет - прерываю цикл, чтобы не было обращения к несуществ. индексу  
      if(array_key_exists($i + 1, $copyArr)) { 
    //Если разность следующего и текущего элемента равна 1, то число линейно возврастает     
        if($copyArr[$i + 1] - $copyArr[$i] === 1) {
    //Значит его надо запихать в кусок
            $chunk[] = $copyArr[$i];
        }
    //Если нет, то линейно не возрастает
        else {
    //Если при этом в куске пусто, значит число единственное в последовательности и его надо пропустить
            if(empty($chunk)) {
                continue;
            }
            else {
    //Если кусок не пустой, то надо докинуть последний элемент в него
            $chunk[] = $copyArr[$i];
    //Затем кинуть сам кусок в группу
            $chunkGroup[] = $chunk;
    //И обнулить
            $chunk = [];
    //Из массива вырезать ту часть, что улетела в кусок
            array_slice($copyArr, $i + 1);
    //Сбросить счётчик, чтобы на новой итерации он начинал с 0
            $i = -1;
            }
        }
      }
      break;
    }

    //В результирующий массив закидываются строки вида "первый элемент вложенного массива -> последний элемент вложенного массива"
    for($j = 0; $j < count($chunkGroup); $j++) {
      $result[] = $chunkGroup[j][0] . "->" . $chunkGroup[j][count($chunkGroup[j]-1)];
    }

    return $result;
}


print_r(summaryRanges([110, 111, 112, 113, 1,2,3, 111, -5, -4, -3, -2, -3, -4, -5]));
  • Вопрос задан
  • 186 просмотров
Подписаться 2 Простой 7 комментариев
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А давайте запишем ваш код красиво, без лишних комментариев и с правильными отступами.
for($i = 0; $i < count($copyArr); $i++) { 
    if(array_key_exists($i + 1, $copyArr)) { 
        if($copyArr[$i + 1] - $copyArr[$i] === 1) {
            $chunk[] = $copyArr[$i];
        } elseif(empty($chunk)) {
            continue;
        } else {
            $chunk[] = $copyArr[$i];
            $chunkGroup[] = $chunk;
            $chunk = [];
            array_slice($copyArr, $i + 1);
            $i = -1;
        }
    }
    break;
}

И что же мы видим? Ой, у нас break безо всяких условий в основном теле цикла.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Stimulate
@Stimulate
могу
Попробуй
function summaryRanges($array) {
	$ranges = [];
	
	for ($i =  0; $i < sizeof($array); $i++) {
		
		if (isset($array[$i+1]) AND ($array[$i]+1 == $array[$i+1])) {
			if (isset($range)) {
				$range[] = $array[$i+1];
			}
			else {
				$range = [$array[$i], $array[$i+1]];
			}

		}
		else {
			if (isset($range)) {
				$ranges[] = $range;
				unset($range);
			}
		}
	}
	return $ranges;
}

print_r(summaryRanges([110, 111, 112, 113, 1,2,3, 100, 101, 102, 111, -5, -4, -3, -2, -3, -4, -5]));
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы