Учитывая этот массив:
$inventory = array(
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
array("type"=>"pork", "price"=>5.43),
);
Я хотел бы отсортировать $inventory
элементы по цене, чтобы получить:
$inventory = array(
array("type"=>"pork", "price"=>5.43),
array("type"=>"fruit", "price"=>3.50),
array("type"=>"milk", "price"=>2.90),
);
Как я могу это сделать?
Ответы:
Вы правы, функция, которую вы ищете, есть
array_multisort()
.Вот пример, взятый прямо из руководства и адаптированный к вашему случаю:
источник
PHP 7+
По состоянию на PHP 7, это можно сделать с помощью сжато
usort
с анонимной функцией , которая использует оператор космического корабля для сравнения элементов.Вы можете сделать сортировку по возрастанию, например так:
Или сортировка по убыванию:
Чтобы понять, как это работает, обратите внимание, что
usort
требуется пользовательская функция сравнения, которая должна вести себя следующим образом (из документов):И обратите внимание
<=>
, что оператор космического корабля,что именно то, что
usort
нужно. Фактически, почти полное обоснование для добавления<=>
к языку в https://wiki.php.net/rfc/combined-comparison-operator заключается в том, чтоPHP 5.3+
В PHP 5.3 введены анонимные функции, но пока нет оператора космического корабля. Мы все еще можем использовать
usort
для сортировки наш массив, но он немного более многословен и труден для понимания:Обратите внимание, что хотя компараторы, работающие с целочисленными значениями, довольно часто просто возвращают разницу значений, например
$item2['price'] - $item1['price']
, мы не можем безопасно сделать это в этом случае. Это потому, что цены - это числа с плавающей запятой в примере задающего вопрос, но функция сравнения, которую мы передаемusort
, должна возвращать целые числа дляusort
правильной работы:Это важная ловушка, которую следует учитывать при использовании
usort
в PHP 5.x! Моя первоначальная версия этого ответа сделала эту ошибку, и все же я набрал десять голосов за тысячи просмотров, очевидно, никто не заметил серьезную ошибку. Простота, с которой такие недоверчивые люди, как я, могут испортить функции компаратора, как раз и является причиной того, что в PHP 7 был добавлен простой в использовании оператор космического корабля.источник
uasort
. Однако, посмотрев документы, этот ответ все еще верен в этом случае . В примере OP сортируемый массив имеет последовательные числовые индексы, а не строковые индексы, поэтомуusort
он более уместен. Использованиеuasort
последовательно индексируемого массива приведет к отсортированному массиву, который не упорядочен по числовым индексам, так что первый элемент, видимый вforeach
цикле, отсутствует$your_array[0]
, что вряд ли будет желательным поведением.В то время как другие правильно предложили использование
array_multisort()
, по какой-то причине ни один из ответов не подтверждает существованиеarray_column()
, что может значительно упростить решение. Так что мое предложение будет:источник
Поскольку ваши элементы массива сами являются массивами со строковыми ключами, лучше всего определить пользовательскую функцию сравнения. Это довольно быстро и легко сделать. Попробуй это:
Производит следующее:
источник
uasort( $inventory, function ($a, $b) { if ( $a==$b ) return 0; else return ($a > $b) ? -1 : 1; });
usort
кажется более подходящим, чемuasort
для сортировки массива с последовательными числовыми ключами. Завершение работы с массивом, где первый элемент находится в индексе,1
а второй элемент в индексе,0
- странное поведение и надежная ловушка для людей, которые не знакомы с деталями массивов PHP;usort
дает вам результат, который вы ожидаете интуитивно.Я закончил на этом:
Просто вызовите функцию, передав массив и имя поля массива второго уровня. Подобно:
источник
Вы можете использовать
usort
с анонимной функцией, например,источник
strnatcmp
, предназначенный для сравнения строк, кажется, здесь работает нормально. По-видимому, «естественный порядок», который он реализует, включает в себя сортировку числовых строк численно, а не лексически.выходы:
источник
От сортировки массива ассоциативных массивов по значению данного ключа в PHP :
uasort ( http://php.net/uasort ) позволяет вам сортировать массив по вашей собственной определенной функции. В вашем случае это просто:
источник
cmp
функция здесь не так. Он должен возвращать «целое число меньше, равно или больше нуля, если первый аргумент считается соответственно меньше, равен или больше второго», но вместо этого возвращаетtrue
илиfalse
. Тем не менее, это замечательно, что все же работает - возможно, потому что текущая реализацияusort
и friends обрабатывает случаи «меньше» и «равно» одинаково - но не рассчитывает на то, что это продолжит работу в будущих версиях PHP. Если они попытаются сделать сортировки стабильными (то есть не перемещаться вокруг равных элементов без необходимости), это сломается.usort
было бы более уместно, чемuasort
здесь, так какuasort
сохраняет связь между ключами и значениями, которая является запутанной и неожиданной при работе с последовательным числовым массивом. Например, индексы$array
выше после вызоваuasort
2, 0 и 1, в этом порядке. Если вы по какой-то причине этого не хотите, вам, вероятно, будет удобнее использоватьusort
этот метод, который переиндексирует массив и переупорядочивает его.Было протестировано на 100 000 записей: время в секундах (рассчитано по фунции времени). Только для уникальных значений при сортировке ключевых позиций.
Решение функции @Josh Davis: Время работы : 1.5768740177155
Шахтный раствор: Время отработки: 0,094044923782349
Решение:
источник
Я использую
uasort
как этоисточник
Эта функция может использоваться повторно:
По умолчанию он хорошо работает со строковыми значениями, но вам придется добавить обратный вызов для функции сравнения чисел, если все ваши значения являются числами.
источник
usortarr
но затем звонитеuasort
вместоusort
; возможно, немного сбивает с толку. Последнее - в случае последовательного массива с числовыми индексами, подобного тому, который показан в вопросе - вероятно, то, что вы действительно хотите.Вы можете попытаться определить свою собственную функцию сравнения, а затем использовать usort .
источник
Вот метод, который я нашел давно и немного почищен. Это прекрасно работает и может быть быстро изменено, чтобы принимать объекты.
Чтобы изменить метод сортировки объектов, просто измените следующую строку:
$tempArray[] = strtolower( $value[ $sortByKey ] );
в$tempArray[] = strtolower( $value->$sortByKey );
Для запуска метода просто сделайте
sortArray($inventory,'price','ASC');
источник
array_multisort
) или мой (сusort
), и, кажется, не дает никаких преимуществ перед ними в обмен.источник
попробуй это:
источник
Завершить динамическую функцию Я перешел сюда для сортировки ассоциативных массивов и нашел эту удивительную функцию на http://php.net/manual/en/function.sort.php . Эта функция очень динамичная, которая сортирует по возрастанию и убыванию с указанным ключом.
Простая функция для сортировки массива по определенному ключу. Поддерживает связь индекса
источник
Для PHP 7 и более поздних версий.
Применение:
источник
источник
попробуй это:
для справки смотрите это: http://php.net/manual/en/function.asort.php
см. различные флаги сортировки здесь: http://www.php.net/manual/en/function.sort.php
источник