20250203
This commit is contained in:
90
sources/traits/ObjectArray/ObjectArrayBasicTrait.php
Normal file
90
sources/traits/ObjectArray/ObjectArrayBasicTrait.php
Normal file
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\ObjectArray;
|
||||
|
||||
use ArrayIterator;
|
||||
|
||||
/**
|
||||
* Часть кода класса ObjectArray, отвечающая за функции из наследуемых интерфейсов и классов.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
*/
|
||||
trait ObjectArrayBasicTrait
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function offsetExists (mixed $offset): bool
|
||||
{
|
||||
return isset($this->Container[$offset]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function offsetGet (mixed $offset): mixed
|
||||
{
|
||||
return $this->container[$offset] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function offsetSet (mixed $offset, mixed $value): void
|
||||
{
|
||||
// Если смещение не указано
|
||||
if (is_null($offset))
|
||||
// - то добавляем объект в конец массива.
|
||||
$this->Container[] = $value;
|
||||
else
|
||||
// - иначе добавляем объект по указанному смещению.
|
||||
$this->Container[$offset] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function offsetUnset (mixed $offset): void
|
||||
{
|
||||
unset($this->Container[$offset]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getIterator (): ArrayIterator
|
||||
{
|
||||
return new ArrayIterator($this->Container);
|
||||
}
|
||||
|
||||
/**
|
||||
* Существует ли элемент по указанному смещению.
|
||||
*
|
||||
* @param mixed $offset Смещение.
|
||||
*
|
||||
* @return bool Существует ли элемент по указанному смещению.
|
||||
*/
|
||||
public function __isset (mixed $offset): bool
|
||||
{
|
||||
return isset($this->data[$offset]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function Serialize (): string
|
||||
{
|
||||
return serialize($this->Container);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function UnSerialize (string $serialized): void
|
||||
{
|
||||
$this->Container = unserialize($serialized);
|
||||
}
|
||||
}
|
26
sources/traits/ObjectArray/ObjectArrayConstantsTrait.php
Normal file
26
sources/traits/ObjectArray/ObjectArrayConstantsTrait.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\ObjectArray;
|
||||
|
||||
use Closure;
|
||||
|
||||
/**
|
||||
* Часть кода класса ObjectArray, отвечающая за константы.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
*/
|
||||
trait ObjectArrayConstantsTrait
|
||||
{
|
||||
/**
|
||||
* @var Closure Функция сравнения объектов по умолчанию.
|
||||
*/
|
||||
public Closure $DefaultComparerFunction {
|
||||
get {
|
||||
return fn (mixed $currentPropertyValue, mixed $searchPropertyValue): bool
|
||||
=> $currentPropertyValue === $searchPropertyValue;
|
||||
}
|
||||
}
|
||||
}
|
283
sources/traits/ObjectArray/ObjectArrayLINQTrait.php
Normal file
283
sources/traits/ObjectArray/ObjectArrayLINQTrait.php
Normal file
@@ -0,0 +1,283 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\ObjectArray;
|
||||
|
||||
use goodboyalex\php_components_pack\classes\ObjectArray;
|
||||
|
||||
/**
|
||||
* Часть кода класса ObjectArray, отвечающая за LINQ-подобные операции.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
*/
|
||||
trait ObjectArrayLINQTrait
|
||||
{
|
||||
/**
|
||||
* Возвращает объект, значение свойства которого минимально.
|
||||
*
|
||||
* @param callable $itemValuePredicate Функция, возвращающая значение свойства объекта.
|
||||
* Параметром является объект массива.
|
||||
*
|
||||
* @return mixed|null Объект, значение свойства которого минимально
|
||||
*/
|
||||
public function MinBy (callable $itemValuePredicate): mixed
|
||||
{
|
||||
return array_reduce($this->Container,
|
||||
fn ($min, $item) => $min === null || $itemValuePredicate($item) < $itemValuePredicate($min) ? $item : $min);
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает объект, значение свойства которого максимально.
|
||||
*
|
||||
* @param callable $itemValuePredicate Функция, возвращающая значение свойства объекта.
|
||||
* Параметром является объект массива.
|
||||
*
|
||||
* @return mixed|null Объект, значение свойства которого максимально.
|
||||
*/
|
||||
public function MaxBy (callable $itemValuePredicate): mixed
|
||||
{
|
||||
return array_reduce($this->Container,
|
||||
fn ($max, $item) => $max === null || $itemValuePredicate($item) > $itemValuePredicate($max) ? $item : $max);
|
||||
}
|
||||
|
||||
/**
|
||||
* Выделяет из массива объектов объект, удовлетворяющий условию. Если объектов несколько, то выбирается первый
|
||||
* встречающийся объект из них. Если объектов нет, вернёт false.
|
||||
*
|
||||
* @param callable|null $selectCondition Функция выборки объектов <code>fn (mixed $item): bool</code>. Вместо неё
|
||||
* можно использовать null, тогда функция выберет текущий объект. По умолчанию, null.
|
||||
*
|
||||
* @return false|mixed Выбранный объект, удовлетворяющий условию, или false, если таких нет.
|
||||
*/
|
||||
public function GetRow (?callable $selectCondition = null): mixed
|
||||
{
|
||||
// Если условие не задано
|
||||
if ($selectCondition === null || !is_callable($selectCondition)) {
|
||||
// - то если массив не пуст
|
||||
if (count($this->Container) > 0)
|
||||
// -- возвращаем первый элемент
|
||||
return $this->Container[0];
|
||||
else
|
||||
// -- иначе возвращаем false
|
||||
return false;
|
||||
}
|
||||
|
||||
// Получаем результаты выборки из массива по условию $selectCondition
|
||||
$result = $this->GetRows($selectCondition);
|
||||
|
||||
// Если результат не найден
|
||||
if (count($result) == 0)
|
||||
// - возвращаем false
|
||||
return false;
|
||||
|
||||
// Возвращаем результат
|
||||
return $result[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Выделяет из массива объектов объекты, удовлетворяющие условию.
|
||||
*
|
||||
* @param callable|null $selectCondition Функция выборки объектов <code>fn (mixed $item): bool</code>. Вместо неё
|
||||
* можно использовать null, тогда функция будет выбирать все объекты. По умолчанию, null.
|
||||
*
|
||||
* @return ObjectArray Массив объектов, удовлетворяющих условию
|
||||
*/
|
||||
public function GetRows (?callable $selectCondition = null): ObjectArray
|
||||
{
|
||||
// Если условие не задано
|
||||
if ($selectCondition === null || !is_callable($selectCondition))
|
||||
// - то возвращаем все элементы
|
||||
return new ObjectArray($this->Container);
|
||||
|
||||
// Создаём результирующий массив
|
||||
$result = [];
|
||||
|
||||
// Проходим по массиву
|
||||
foreach ($this->Container as $item) {
|
||||
// - пропускаем не объекты
|
||||
if (!is_object($item))
|
||||
continue;
|
||||
|
||||
// - если объект удовлетворяет условию
|
||||
if ($selectCondition($item))
|
||||
// -- добавляем его в результат
|
||||
$result[] = $item;
|
||||
}
|
||||
|
||||
// Возвращаем результат
|
||||
return new ObjectArray($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Получение значение единичного поля. Если полей по выборке будет больше одного, то вернёт первое из них.
|
||||
*
|
||||
* @param string $column Требуемый столбец
|
||||
* @param callable|null $wherePredicate Условие выборки <code>fn (mixed $item): bool</code>, которое проверяет,
|
||||
* подходит элемент или нет.
|
||||
*
|
||||
* @return mixed|null Результат запроса или null в случае ошибки
|
||||
*/
|
||||
public function GetValue (string $column, ?callable $wherePredicate = null): mixed
|
||||
{
|
||||
// Получаю колонку
|
||||
$result = $this->GetColumn($column, $wherePredicate);
|
||||
|
||||
// Если результат пуст
|
||||
if (count($result) == 0)
|
||||
// -- возвращаю null
|
||||
return null;
|
||||
|
||||
// Возвращаю результат
|
||||
return $result[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Получает колонку в массиве данных.
|
||||
*
|
||||
* @param string $column Имя колонки.
|
||||
* @param callable|null $wherePredicate Условие выборки <code>fn (mixed $item): bool</code>, которое проверяет,
|
||||
* подходит элемент или нет.
|
||||
*
|
||||
* @return array Ассоциированный массив с результатом выборки.
|
||||
*/
|
||||
public function GetColumn (string $column, ?callable $wherePredicate = null): array
|
||||
{
|
||||
// Создаю результат
|
||||
$result = [];
|
||||
|
||||
// Прохожу по массиву
|
||||
foreach ($this->Container as $item) {
|
||||
// - пропускаю не объекты
|
||||
if (!is_object($item))
|
||||
continue;
|
||||
|
||||
// - пропускаю не имеющие требуемого свойства
|
||||
if (!property_exists($item, $column))
|
||||
continue;
|
||||
|
||||
// - пропускаю не удовлетворяющие условию
|
||||
if ($wherePredicate !== null && !$wherePredicate($item))
|
||||
continue;
|
||||
|
||||
// - добавляю значение свойства в результат
|
||||
$result[] = $item->$column;
|
||||
}
|
||||
|
||||
// Возвращаю результат
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Заменяет данные в строке\ массива.
|
||||
*
|
||||
* @param mixed $setItem Заменяемые элемент.
|
||||
* @param callable $wherePredicate Условие выборки <code>fn (mixed $item): bool</code>, которое проверяет,
|
||||
* подходит элемент или нет.
|
||||
*
|
||||
* @return bool Результат выполнения
|
||||
*/
|
||||
public function Update (array $setItems, callable $wherePredicate): bool
|
||||
{
|
||||
// Удаляю элементы
|
||||
$result = $this->Delete($wherePredicate);
|
||||
|
||||
// Добавляю новые элементы
|
||||
foreach ($setItems as $item)
|
||||
$this->Container[] = $item;
|
||||
|
||||
// Возвращаю результат
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Удаляет строки по условию.
|
||||
*
|
||||
* @param callable|null $wherePredicate Условие выборки <code>fn (mixed $item): bool</code>, которое проверяет,
|
||||
* подходит элемент или нет.
|
||||
*
|
||||
* @return bool Результат выполнения. Будет true, если все строки, удовлетворяющие условию удалены успешно,
|
||||
* иначе false.
|
||||
*/
|
||||
public function Delete (?callable $wherePredicate = null): bool
|
||||
{
|
||||
// Задаю результат
|
||||
$result = true;
|
||||
|
||||
// Получаю массив строк
|
||||
$array = $this->GetRows($wherePredicate);
|
||||
|
||||
// Каждый элемент в этих строках
|
||||
foreach ($array as $item) {
|
||||
// - получаю его индекс в основном массиве
|
||||
$key = array_search($item, $this->Container);
|
||||
|
||||
// - и если индекс найден
|
||||
if ($key !== false) {
|
||||
// -- удаляю элемент из основного массива
|
||||
$resultArray = array_splice($this->Container, $key, 1);
|
||||
|
||||
// -- и если удаление прошло успешно, то будет true
|
||||
$result = $result && count($resultArray) > 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Возвращаю результат
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, существует ли объект в массиве.
|
||||
*
|
||||
* @param callable|null $where Условие выборки <code>fn (mixed $item): bool</code>, которое проверяет, подходит ли
|
||||
* объект или нет. Может принимать вместо замыкания null, тогда вернёт false. По умолчанию null.
|
||||
*
|
||||
* @return bool Результат проверки
|
||||
*/
|
||||
public function IsExist (?callable $where = null): bool
|
||||
{
|
||||
// Если условие не задано
|
||||
if ($where === null || !is_callable($where))
|
||||
// - то возвращаем false
|
||||
return false;
|
||||
|
||||
// Вывожу результат
|
||||
return $this->Count($where) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Считает количество объектов в массиве, удовлетворяющих условию.
|
||||
*
|
||||
* @param callable|null $predicate Функция, возвращающая bool: true, если объект удовлетворяет условию, false, если
|
||||
* не удовлетворяет. Параметром является объект массива. Вместо функции можно передать null, тогда результатом
|
||||
* будет общее количество объектов в массиве. По умолчанию, null.
|
||||
*
|
||||
* @return int Количество объектов, удовлетворяющих условию
|
||||
*/
|
||||
public function Count (?callable $predicate = null): int
|
||||
{
|
||||
// Если условие не задано
|
||||
if ($predicate === null || !is_callable($predicate))
|
||||
// - то возвращаем общее количество объектов
|
||||
return count($this->Container);
|
||||
|
||||
// Создаём результирующее число
|
||||
$result = 0;
|
||||
|
||||
// Проходим по массиву
|
||||
foreach ($this->Container as $item) {
|
||||
// - пропускаем не объекты
|
||||
if (!is_object($item))
|
||||
continue;
|
||||
|
||||
// - если элемент удовлетворяет условию
|
||||
if ($predicate($item))
|
||||
// -- добавляем счётчик
|
||||
$result++;
|
||||
}
|
||||
|
||||
// Возвращаем результат
|
||||
return $result;
|
||||
}
|
||||
}
|
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