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

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

Мы отсортировали массив с помощью встроенной функции 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.

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

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

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

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

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

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

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