PHP 7+
По состоянию на PHP 7, это можно сделать с помощью сжато usort
с анонимной функцией , которая использует оператор космического корабля для сравнения элементов.
Вы можете сделать сортировку по возрастанию, например так:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
Или сортировка по убыванию:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
Чтобы понять, как это работает, обратите внимание, что usort
требуется пользовательская функция сравнения, которая должна вести себя следующим образом (из документов):
Функция сравнения должна возвращать целое число меньше, равно или больше нуля, если первый аргумент считается соответственно меньше, равен или больше второго.
И обратите внимание <=>
, что оператор космического корабля,
возвращает 0, если оба операнда равны, 1, если левый больше, и -1, если правый больше
что именно то, что usort
нужно. Фактически, почти полное обоснование для добавления <=>
к языку в https://wiki.php.net/rfc/combined-comparison-operator заключается в том, что
делает написание заказа обратного вызова для использования с usort()
проще
PHP 5.3+
В PHP 5.3 введены анонимные функции, но пока нет оператора космического корабля. Мы все еще можем использовать usort
для сортировки наш массив, но он немного более многословен и труден для понимания:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
Обратите внимание, что хотя компараторы, работающие с целочисленными значениями, довольно часто просто возвращают разницу значений, например $item2['price'] - $item1['price']
, мы не можем безопасно сделать это в этом случае. Это потому, что цены - это числа с плавающей запятой в примере задающего вопрос, но функция сравнения, которую мы передаем usort
, должна возвращать целые числа для usort
правильной работы:
Возвращение нецелых значений из функции сравнения, такой как float, приведет к внутреннему приведению к целому числу возвращаемого значения обратного вызова. Таким образом, такие значения, как 0,99 и 0,1, будут преобразованы в целочисленное значение 0, которое будет сравнивать такие значения как равные.
Это важная ловушка, которую следует учитывать при использовании usort
в PHP 5.x! Моя первоначальная версия этого ответа сделала эту ошибку, и все же я набрал десять голосов за тысячи просмотров, очевидно, никто не заметил серьезную ошибку. Простота, с которой такие недоверчивые люди, как я, могут испортить функции компаратора, как раз и является причиной того, что в PHP 7 был добавлен простой в использовании оператор космического корабля.