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