Для изменения массива в алгоритмических задачках часто используется прием с введением третьей переменной. Это бывает полезно в тех случаях, когда значения в массиве меняются местами.
В этом уроке мы реализуем функцию reverse
, которая располагает значения в обратном порядке без создания нового массива. Вариант с созданием нового массива предпочтительнее с точки зрения простоты и поддержки кода, но вариант без нового массива полезнее для изучения алгоритмов.
Чтобы реализовать алгоритм, нужно поменять местами элементы, которые стоят зеркально относительно центра:
<?php
function reverseArray($coll)
{
$size = count($coll);
$maxIndex = floor($size / 2);
for ($i = 0; $i < $maxIndex; $i++) {
$mirrorIndex = $size - $i - 1;
$temp = $coll[$i];
$coll[$i] = $coll[$mirrorIndex];
$coll[$mirrorIndex] = $temp;
}
return $coll;
}
print_r(reverseArray([3, 2]));
// => Array
// => (
// => [0] => 2
// => [1] => 3
// => )
print_r(reverseArray([3, 56, 2]));
// => Array
// => (
// => [0] => 2
// => [1] => 56
// => [2] => 3
// => )
print_r(reverseArray(['one', 'two', 'three', 'four']));
// => Array
// => (
// => [0] => four
// => [1] => three
// => [2] => two
// => [3] => one
// => )
https://repl.it/@hexlet/php-arrays-exchange
Для начала разберемся, до какого индекса двигаться и производить обмен. Очевидно, что нужно идти до середины массива. Но что делать, если в массиве нечетное количество элементов?
В такой ситуации после реверса центральный элемент останется на своем месте, то есть при нечетном числе элементов можно округлять результат деления до нижней границы. Например, для массива из пяти элементов нужно 5 поделить на 2 и округлить результат до 2 — ближайшего числа снизу. В PHP для округления вниз есть встроенная функция floor
. Соответственно, само вычисление выглядит так:
floor(count($coll) / 2);
Этот код работает универсально для массивов с четным и нечетным числом элементов.
Внутри тела цикла происходит самое интересное. Нам нужно поменять два значения местами. Если попытаться сразу одному значению присвоить другое, то мы потеряем исходное значение. Поэтому сначала нужно сохранить значение во временную переменную $temp = $coll[$i];
. Только затем нужно вычислить индекс на зеркальной позиции и провести обмен значениями.
Введение временной переменной для промежуточного хранения результата — распространенный прием в алгоритмических задачах, который помогает выполнять обмен значениями.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.