Сортировка массива объектов по полям объекта

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

  • Использование usort в php с частной функцией класса
  • Получить возможные комбинации массивов
  • Сортировка многомерного массива
  • Как выполнить поиск по key => значение в многомерном массиве в PHP
  • PHP разбивает массивы на группы на основе равных значений
  • Как получить все комбинации из нескольких массивов?
  • PHP foreach loop для заполнения выпадающего списка со значениями из массива массивов
  • 13 Solutions collect form web for “Сортировка массива объектов по полям объекта”

    Используйте usort , вот пример, адаптированный из руководства:

     function cmp($a, $b) { return strcmp($a->name, $b->name); } usort($your_data, "cmp"); 

    редактирование, импортированное из комментариев:

    Если вы сортируете массив изнутри класса и ваша функция сортировки cmp также определена внутри класса, то используйте это:

     usort($your_data, array($this, "cmp")) 

    Это лучший способ использования закрытий

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

    Обратите внимание: это не в документации PHP, но если вы используете закрытие 5.3+, поддерживаются аргументы, вызываемые аргументами.

    если вы используете php oop, вам может потребоваться изменить:

     public static function cmp($a, $b) { return strcmp($a->name, $b->name); } //in this case FUNCTION_NAME would be cmp usort($your_data, array('YOUR_CLASS_NAME','FUNCTION_NAME')); 
     usort($array, 'my_sort_function'); var_dump($array); function my_sort_function($a, $b) { return $a->name < $b->name; } 

    Тот же код будет с полем count .

    Подробнее о usort : http://ru2.php.net/usort

    Кстати, откуда вы взяли этот массив? Надеюсь, что не из базы данных?

    Вы можете использовать эту функцию (работает в версии PHP> = 5.3):

     function sortArrayByKey(&$array,$key,$string = false,$asc = true){ if($string){ usort($array,function ($a, $b) use(&$key,&$asc) { if($asc) return strcmp(strtolower($a{$key}), strtolower($b{$key})); else return strcmp(strtolower($b{$key}), strtolower($a{$key})); }); }else{ usort($array,function ($a, $b) use(&$key,&$asc) { if($a[$key] == $b{$key}){return 0;} if($asc) return ($a{$key} < $b{$key}) ? -1 : 1; else return ($a{$key} > $b{$key}) ? -1 : 1; }); } } 

    Пример:

     sortArrayByKey($yourArray,"name",true); //String sort (ascending order) sortArrayByKey($yourArray,"name",true,false); //String sort (descending order) sortArrayByKey($yourArray,"id"); //number sort (ascending order) sortArrayByKey($yourArray,"count",false,false); //number sort (descending order) 

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

    Помните, чтобы сначала использовать setlocale с LC_COLLATE чтобы установить 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); }); 

    Если вы используете это внутри Codeigniter, вы можете использовать следующие методы:

     usort($jobs, array($this->job_model, "sortJobs")); // function inside Model usort($jobs, array($this, "sortJobs")); // Written inside Controller. 

    @rmooney благодарю вас за предложение. Это действительно помогает мне.

    Нижняя сторона всех ответов здесь заключается в том, что они используют имена статических полей, поэтому я написал скорректированную версию в стиле ООП. Предположим, вы используете методы getter, которые вы можете использовать непосредственно в этом классе и использовать имя поля в качестве параметра . Вероятно, кто-то считает это полезным.

     class CustomSort{ public $field = ''; public function cmp($a, $b) { /** * field for order is in a class variable $field * using getter function with naming convention getVariable() we set first letter to uppercase * we use variable variable names - $a->{'varName'} would directly access a field */ return strcmp($a->{'get'.ucfirst($this->field)}(), $b->{'get'.ucfirst($this->field)}()); } public function sortObjectArrayByField($array, $field) { $this->field = $field; usort($array, array("Your\Namespace\CustomSort", "cmp"));; return $array; } } 

    Вы можете использовать usort , например:

     usort($array,function($first,$second){ return strcmp($first->name, $second->name); }); 

    Если вам нужно отсортировать только по одному полю, то usort – хороший выбор. Однако решение быстро становится беспорядочным, если вам нужно сортировать по нескольким полям. В этом случае может использоваться библиотека YaLinqo *, которая реализует 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; } function ($v) { return $v->count; } (либо можно использовать). Эти цепочки методов возвращают итераторы, но вы можете получить массивы, добавив в конец ->toArray() если вам это нужно.

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

    Вы можете использовать отсортированную функцию от 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')); 

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

     usort($listable_products, function($a, $b) { global $translator; return strcmp($a->getFullTitle($translator), $b->getFullTitle($translator)); }); 

    Если вы хотите отсортировать целочисленные значения:

     // Desc sort usort($array,function($first,$second){ return $first->number < $second->number; }); // Asc sort usort($array,function($first,$second){ return $first->number > $second->number; }); 
    PHP is the Best Programming Language in the world.