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.