Как стать автором
Обновить

Сортировка объектов в PHP

Время на прочтение2 мин
Количество просмотров7K
В PHP так много различного функционала для работы с массивами, а вот для объектов порой приходится изобретать велосипеды снова и снова. Так какой велосипед сегодня?
На днях возникла совершенно, казалось бы, элементарная задача — отсортировать множество объектов, полученное из базы данных в виде rowset. Функции сортировки работают с массивами и нет им дела до объектов. Вот тут нам на помощь приходит функция сортировки с использованием определенной пользователем функцией — usort( array &$array, callback $cmp_function). Вторым аргументом как раз и можем сделать нашу операцию сравнения объектов.
Допустим, мы получили из базы данных множество городов мира. Для одной задачи нам необходимо отсортировать эти города по количеству населения, для другой — по среднегодовой температуре, для третьей — в алфавитном порядке по названию города. Не делать же для этого три различных запроса в базу. Так что приступаем к реализации сортировки.
<?php

usort($citiesForSort, 'sortByPopulation');

function sortByPopulation($city1, $city2){
  if($city1->Population == $city2->Population) 
    return 0; 
  return ($city1->Population > $city2->Population) ? -1 : 1;
}
?>


* This source code was highlighted with Source Code Highlighter.


В общем-то готово, но сюда так и просятся замыкания, ведь правда?
<?php

usort($citiesForSort, function($city1,$city2){
               if($city1->Population == $city2->Population) return 0;
               return ($city1->Population > $city2->Population) ? -1 : 1;});

?>


* This source code was highlighted with Source Code Highlighter.


А если все это обернем в функцию и идентификатор сделаем переменной, то получится вполне полезная функция сортировки объектов
<?php
function sortObjectSetBy($objectSetForSort, $sortBy){

  usort($objectSetForSort, function($object1,$object2) use ($sortBy){
                   if($object1->$sortBy == $object2->$sortBy) return 0;
                   return ($object1->$sortBy > $object2->$sortBy) ? -1 : 1;});

  return $objectSetForSort;
}
?>

* This source code was highlighted with Source Code Highlighter.
Теги:
Хабы:
Всего голосов 36: ↑19 и ↓17+2
Комментарии15

Публикации

Истории

Ближайшие события

Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург