20250203
This commit is contained in:
129
sources/traits/ObjectArray/ObjectArraySearchAndSortTrait.php
Normal file
129
sources/traits/ObjectArray/ObjectArraySearchAndSortTrait.php
Normal file
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\ObjectArray;
|
||||
|
||||
/**
|
||||
* Часть кода класса ObjectArray, отвечающая за поиск и исключение объектов.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
*/
|
||||
trait ObjectArraySearchAndSortTrait
|
||||
{
|
||||
/**
|
||||
* Сортирует массив объектов, по пользовательской функции.
|
||||
*
|
||||
* @param callable $objectPropertyValuePredicate Функция <code>fn (mixed $item): mixed => $item-><PROPERTY></code>,
|
||||
* возвращающая сравниваемый объект. Возвращаемое значение должно быть значением свойства этого объекта.
|
||||
*
|
||||
* <code>
|
||||
* class Demo;
|
||||
* {
|
||||
* public string $Property1;
|
||||
* public string $Property2;
|
||||
* public function __construct(string $Property1, string $Property2)
|
||||
* {
|
||||
* $this->Property1 = $Property1;
|
||||
* $this->Property2 = $Property2;
|
||||
* }
|
||||
* }
|
||||
* $array = new ObjectArray (
|
||||
* [
|
||||
* new Demo('1', '2'),
|
||||
* new Demo('5', '6'),
|
||||
* new Demo('3', '4')
|
||||
* ]);
|
||||
*
|
||||
* // output:
|
||||
* // [Demo('1', '2'), Demo('3', '4'), Demo('5', '6')]
|
||||
* $result = $array->SortCallback($array, fn ($item): mixed => $item->Property1);
|
||||
* </code>
|
||||
* @param bool $descending Направление сортировки
|
||||
*
|
||||
* @return array Отсортированный массив объектов
|
||||
*/
|
||||
public function SortCallback (callable $objectPropertyValuePredicate, bool $descending = false): array
|
||||
{
|
||||
// Создаём результирующий массив
|
||||
$result = array_merge($this->Container, []);
|
||||
|
||||
// Сортируем массив
|
||||
usort($result,
|
||||
fn ($a, $b)
|
||||
=> !$descending
|
||||
? $objectPropertyValuePredicate($a) <=> $objectPropertyValuePredicate($b)
|
||||
: $objectPropertyValuePredicate($b) <=> $objectPropertyValuePredicate($a));
|
||||
|
||||
// Возвращаем результат
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Сортирует массив объектов, по значению свойства объекта.
|
||||
*
|
||||
* @param string $objectProperty Имя свойства объекта
|
||||
* @param bool $descending Направление сортировки
|
||||
*
|
||||
* @return array Отсортированный массив объектов
|
||||
*/
|
||||
public function Sort (string $objectProperty, bool $descending = false): array
|
||||
{
|
||||
// Создаём результирующий массив
|
||||
$result = array_merge($this->Container, []);
|
||||
|
||||
// Сортируем массив
|
||||
usort($result,
|
||||
fn ($a, $b)
|
||||
=> !$descending
|
||||
? $a->$objectProperty <=> $b->$objectProperty
|
||||
: $b->$objectProperty <=> $a->$objectProperty);
|
||||
|
||||
// Возвращаем результат
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Поиск объекта в массиве объектов по значению свойства объекта.
|
||||
*
|
||||
* @param string $forProperty Имя искомого свойства объекта.
|
||||
* @param mixed $searchValue Искомое значение свойства объекта.
|
||||
* @param callable|null $compareFunction Функция сравнения, принимающая два параметра: mixed $currentPropertyValue
|
||||
* (текущее значение свойства) и mixed $searchPropertyValue (поисковое значение свойства) и возвращает bool -
|
||||
* true, если значение свойства совпадает с искомым, false - если не совпадает. Если передаётся null, то будет
|
||||
* использоваться DefaultComparerFunction. По умолчанию, null.
|
||||
*
|
||||
* @return mixed Объект, найденный по значению свойства или null, если не найден
|
||||
*/
|
||||
public function Search (string $forProperty, mixed $searchValue, ?callable $compareFunction = null): mixed
|
||||
{
|
||||
// Проходим по массиву
|
||||
foreach ($this->Container as $item) {
|
||||
// - пропускаем не объекты
|
||||
if (!is_object($item))
|
||||
continue;
|
||||
|
||||
// - пропускаем, если значение свойства нет в этом объекте
|
||||
if (!property_exists($item, $forProperty))
|
||||
continue;
|
||||
|
||||
// - пропускаем, если значение свойства не задано
|
||||
if (!isset($item->$forProperty))
|
||||
continue;
|
||||
|
||||
// - если не задана функция сравнения
|
||||
if (is_null($compareFunction) || !is_callable($compareFunction))
|
||||
// -- то устанавливаем функцию сравнения по умолчанию
|
||||
$compareFunction = $this->DefaultComparerFunction;
|
||||
|
||||
// - если значение свойства совпадает с искомым
|
||||
if ($compareFunction($item->$forProperty, $searchValue))
|
||||
// -- возвращаем объект
|
||||
return $item;
|
||||
}
|
||||
|
||||
// Если мы сюда дошли, значить объект не найден - возвращаем null
|
||||
return null;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user