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