• Теория
  • Теория

Меняем направление сортировки

Мы отсортировали массив с помощью встроенной функции uasort. При этом мы передали ей функцию sort_by_price. Что это за функция?

Это колбэк. Так называют функцию, которая передаётся в качестве аргумента другой функции. Колбэки не являются встроенными функциями, их пишут сами разработчики. Посмотрим, как устроена функция sort_by_price.

В качестве аргументов она принимает два товара, сравнивает цены этих товаров и возвращает число: 1, -1 или 0.

function sort_by_price($product_1, $product_2) {
  // Если цена первого товара больше, результат - положительное число
  if ($product_1['price'] > $product_2['price']) {
    $result = 1;
  }

  // Если цена первого товара меньше, результат - отрицательное число
  if ($product_1['price'] < $product_2['price']) {
    $result = -1;
  }

  // Если цены равны, результат равен нулю
  if ($product_1['price'] === $product_2['price']) {
    $result = 0;
  }

  return $result;
}

Почему мы использовали именно такой колбэк? Потому что так предписывает документация PHP. Функция-колбэк, которую передают uasort, должна принимать два аргумента и возвращать число: положительное число, если первый аргумент больше, отрицательное число, если больше второй аргумент, и ноль, если аргументы равны. Имя колбэка, имена его аргументов и код в теле функции могут быть любыми.

Во время вызова функция uasort передаёт в колбэк попарно элементы массива, узнаёт, какой из них больше, и сортирует массив по возрастанию: от меньшего к большему.

Так как мы сортируем товары по цене, то используем в колбэке ключ 'price'. Таким образом мы сообщаем функции uasort, что большим нужно считать тот товар, у которого цена выше.

Мы отсортировали товары от самых дешёвых к самым дорогим. Попробуем сделать наоборот — отсортировать товары от самых дорогих к самым дешёвым. Чтобы изменить направление сортировки, скажем функции uasort, что большим нужно считать тот товар, цена которого ниже.

В этом случае функция sort_by_price должна возвращать положительное число, если первый товар дешевле, и отрицательное, если первый товар дороже. Для этого достаточно поменять местами 1 и -1.

// Если цена первого товара больше, результат - отрицательное число
if ($product_1['price'] > $product_2['price']) {
  $result = -1;
}

// Если цена первого товара меньше, результат - положительное число
if ($product_1['price'] < $product_2['price']) {
  $result = 1;
}

Положительные и отрицательные числа, которые возвращает колбэк, не обязательно должны быть 1 и -1. Это могут быть любые целые числа в диапазоне от -2147483648 до 2147483647.

Но если элементы, которые сравниваются, равны, колбэк должен вернуть именно ноль.

Хорошо владеете JavaScript, но до сих пор не освоили Node.js? Записывайтесь на профессиональный курс «Node.js. Профессиональная разработка REST API». Цена 12 000 ₽.

Минимальный вид табов
  • index.html
HTML
HTML

Вы перешли на другую страницу

Кликните внутри мини-браузера, чтобы поставить фокус в это окно.

100%
Бабушка Кекс

Притормози, дружище

Проходить вызовы части «Массивы и функции в PHP» тренажёра «Знакомство с PHP» можно после регистрации и оформления подписки.