Как я могу отсортировать этот массив объектов по одному из его полей, например name
или count
?
Array
(
[0] => stdClass Object
(
[ID] => 1
[name] => Mary Jane
[count] => 420
)
[1] => stdClass Object
(
[ID] => 2
[name] => Johnny
[count] => 234
)
[2] => stdClass Object
(
[ID] => 3
[name] => Kathy
[count] => 4354
)
....
Вот хороший способ использования замыканий
Обратите внимание, что этого нет в документации PHP, но если вы используете 5.3+, поддерживаются замыкания, где могут быть предоставлены вызываемые аргументы.
источник
uasort()
-1 * strcmp($a->name, $b->name);
strcmp($b->name, $a->name)
usort
но функция сравнения такая же. Используя это, вам нужно будет дублировать код для замыкания вместо того, чтобы вызыватьprotected static
метод, который вам нужно будет определить только один раз в родительском классе.Если вы хотите отсортировать целочисленные значения:
ОБНОВЛЕНО строкой, не забудьте преобразовать в тот же регистр (верхний или нижний)
источник
если вы используете php oop, вам может потребоваться перейти на:
источник
Тот же код будет с
count
полем.Подробнее о
usort
: http://ru2.php.net/usortКстати, откуда вы взяли этот массив? Я надеюсь, что не из базы данных?
источник
$result
будет содержать,TRUE
если это успешно, и ваше сравнение должно быть$a->name > $b->name
. :)ORDER BY count
create_function('$a,$b', "return $a->count < $b->count;")
но я не могу заставить его работать :( Я получаю несколько уведомлений и предупреждений, что usort ожидает, что параметр 2 будет действительным обратным вызовомВы можете использовать эту функцию (работает в версии PHP> = 5.3):
Пример:
источник
$a->{$key}
и$b->{$key}
вместо того ,$a[$key]
и$b[$key]
как мы, строго говоря, дело со свойствами , а не членов массива, но это было до сих пор ответа я искал.Вы можете использовать
usort
, как это:источник
Если все не получается, вот другое решение:
источник
Недостатком всех ответов здесь является то, что они используют статические имена полей, поэтому я написал скорректированную версию в стиле ООП. Предполагая, что вы используете методы получения, вы можете напрямую использовать этот класс и использовать имя поля в качестве параметра . Возможно, кто-то найдет это полезным.
источник
если вы хотите отсортировать даты
источник
Простая альтернатива, которая позволяет динамически определять поле, на котором основана сортировка:
Это основано на классе Closure , который разрешает анонимные функции. Он доступен начиная с PHP 5.3.
источник
Если вам нужно локальное сравнение строк, вы можете использовать
strcoll
вместоstrcmp
.Запомните сначала использовать
setlocale
с,LC_COLLATE
чтобы установить информацию о локали, если это необходимо.источник
Если вы используете это внутри Codeigniter, вы можете использовать методы:
@rmooney спасибо за предложение. Это действительно помогает мне.
источник
Спасибо за вдохновение, мне также пришлось добавить внешний параметр $ transator
источник
Если вам нужно отсортировать только по одному полю, то
usort
это хороший выбор. Однако решение быстро становится беспорядочным, если вам нужно отсортировать по нескольким полям. В этом случае можно использовать библиотеку YaLinqo *, которая реализует синтаксис SQL-подобных запросов для массивов и объектов. У него красивый синтаксис для всех случаев:Здесь
'$v->count'
сокращение дляfunction ($v) { return $v->count; }
(может использоваться любой). Эти цепочки методов возвращают итераторы, но вы можете получить массивы, добавив->toArray()
в конце, если вам это нужно.* разработано мной
источник
Вы можете использовать отсортированную функцию из Nspl :
источник
Это то, что я имею для служебного класса
Назови это:
источник
Вы можете использовать usort, как это
Если вы хотите отсортировать по номеру:
Или Abc char:
Подробнее: https://www.php.net/manual/en/function.usort.php
источник