Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Обмен значений PHP: Массивы

Для изменения массива в алгоритмических задачках часто используется прием с введением третьей переменной. Это бывает полезно в тех случаях, когда значения в массиве меняются местами.

В этом уроке мы реализуем функцию 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];. Только затем нужно вычислить индекс на зеркальной позиции и провести обмен значениями.

Введение временной переменной для промежуточного хранения результата — распространенный прием в алгоритмических задачах, который помогает выполнять обмен значениями.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Занимайтесь созданием сайтов, веб-приложений, сервисов и их интеграцией с внутренними бизнес-системами на бекенд-языке PHP
10 месяцев
с нуля
Старт 28 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»