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-comppare-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.