Сортировать массив объектов по полям объекта - PullRequest
462 голосов
/ 26 ноября 2010

Как мне отсортировать этот массив объектов по одному из его полей, например 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
        )

   ....

Ответы [ 18 ]

1 голос
/ 05 июля 2013

Если вам нужно локальное сравнение строк, вы можете использовать strcoll вместо strcmp.

Запомните сначала setlocale с LC_COLLATE для установки информации о локали при необходимости.

  usort($your_data,function($a,$b){
    setlocale (LC_COLLATE, 'pl_PL.UTF-8'); // Example of Polish language collation
    return strcoll($a->name,$b->name);
  });
1 голос
/ 07 июня 2016

Спасибо за вдохновение, мне также пришлось добавить параметр внешнего $ transator

usort($listable_products, function($a, $b) {
    global $translator;
    return strcmp($a->getFullTitle($translator), $b->getFullTitle($translator));
});
1 голос
/ 29 июня 2018

Простая альтернатива, которая позволяет динамически определять поле, на котором основана сортировка:

$order_by = 'name';
usort($your_data, function ($a, $b) use ($order_by)
{
    return strcmp($a->{$order_by}, $b->{$order_by});
});

Это основано на Классе закрытия , который позволяет анонимные функции.Он доступен с PHP 5.3.

0 голосов
/ 03 июля 2019

Вы можете использовать usort следующим образом

Если вы хотите отсортировать по номеру:

function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

Или Abc char:

function cmp($a, $b)
{
    return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits, "cmp");

Подробнее: https://www.php.net/manual/en/function.usort.php

0 голосов
/ 27 сентября 2018

Это то, что у меня есть для служебного класса

class Util
{
    public static function sortArrayByName(&$arrayToSort, $meta) {
        usort($arrayToSort, function($a, $b) use ($meta) {
            return strcmp($a[$meta], $b[$meta]);
        });
    }
}

Назовите его:

Util::sortArrayByName($array, "array_property_name");
0 голосов
/ 19 апреля 2018

, если вы хотите отсортировать даты

   usort($threads,function($first,$second){
        return strtotime($first->dateandtime) < strtotime($second->dateandtime);
    });
0 голосов
/ 04 июня 2015

Если вам нужно отсортировать только по одному полю, тогда usort - хороший выбор. Однако решение быстро становится беспорядочным, если вам нужно отсортировать по нескольким полям. В этом случае можно использовать YaLinqo library *, которая реализует синтаксис SQL-подобных запросов для массивов и объектов. Он имеет красивый синтаксис для всех случаев:

$sortedByName         = from($objects)->orderBy('$v->name');
$sortedByCount        = from($objects)->orderBy('$v->count');
$sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name');

Здесь '$v->count' является сокращением для function ($v) { return $v->count; } (может использоваться любой из них). Эти цепочки методов возвращают итераторы, но вы можете получить массивы, добавив ->toArray() в конце, если вам это нужно.

* разработано мной

0 голосов
/ 24 февраля 2016

Вы можете использовать функцию sorted из Nspl :

use function \nspl\a\sorted;
use function \nspl\op\propertyGetter;
use function \nspl\op\methodCaller;

// Sort by property value
$sortedByCount = sorted($objects, propertyGetter('count'));

// Or sort by result of method call
$sortedByName = sorted($objects, methodCaller('getName'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...