20250724 1.2
[+] Добавлен новый тип GUID. [*] В класс ObjectArray добавлена реализация интерфейсов IHashable, ISortable, IComparable. [*] В класс Dictionary добавлена реализация интерфейсов IArrayable, IHashable, ISortable, IComparable. [-] Класс GUIDExtension и все его методы помечены как устаревшие и скоро будут удалены.
This commit is contained in:
89
sources/traits/ObjectArray/ObjectArrayComparableTrait.php
Normal file
89
sources/traits/ObjectArray/ObjectArrayComparableTrait.php
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\ObjectArray;
|
||||
|
||||
/**
|
||||
* Часть кода класса ObjectArray, отвечающая за реализацию интерфейса IComparable.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.2
|
||||
*/
|
||||
trait ObjectArrayComparableTrait
|
||||
{
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function CompareTo (mixed $other): int
|
||||
{
|
||||
// Сравниваем на равенство
|
||||
if ($this->IsEqualsTo($other))
|
||||
// - если равны, то возвращаем 0
|
||||
return 0;
|
||||
|
||||
// Возвращаем результат сравнения количества элементов
|
||||
return $this->Count() > $other->Count() ? 1 : -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function IsEqualsTo (mixed $other): bool
|
||||
{
|
||||
// Получаем хэши
|
||||
// - этого объекта
|
||||
$thisHash = $this->Hash();
|
||||
// - переданного объекта
|
||||
$otherHash = $other->Hash();
|
||||
|
||||
// Сравниваем хэши и возвращаем результат
|
||||
return $thisHash == $otherHash;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function CompareByProperty (string $propertyName, mixed $other): int
|
||||
{
|
||||
// Получаем значения свойств
|
||||
// - этого объекта
|
||||
$thisProperty = $this->GetColumn($propertyName);
|
||||
// - переданного объекта
|
||||
$otherProperty = $other->GetColumn($propertyName);
|
||||
|
||||
// Сравниваем их по количеству
|
||||
if (count($thisProperty) !== count($otherProperty))
|
||||
// - если количество элементов не совпадает, то возвращаем результат
|
||||
return count($thisProperty) > count($otherProperty) ? 1 : -1;
|
||||
|
||||
// Переменная для хранения результата
|
||||
$delta = 0;
|
||||
|
||||
// Проходимся по массивам
|
||||
for ($i = 0; $i < count($thisProperty); $i++) {
|
||||
// - получаем значения
|
||||
// -- текущего массива
|
||||
$thisValue = $thisProperty[$i];
|
||||
// -- переданного массива
|
||||
$otherValue = $otherProperty[$i];
|
||||
|
||||
// - если значения равны
|
||||
if ($thisValue === $otherValue)
|
||||
// - то пропускаем элемент
|
||||
continue;
|
||||
|
||||
// - иначе сравниваем
|
||||
if ($thisValue > $otherValue)
|
||||
// - если текущее значение больше, то увеличиваем счетчик
|
||||
$delta++;
|
||||
else
|
||||
// - иначе уменьшаем счетчик
|
||||
$delta--;
|
||||
}
|
||||
|
||||
// Возвращаем результат
|
||||
return $delta === 0 ? 0 : ($delta > 0 ? 1 : -1);
|
||||
}
|
||||
}
|
66
sources/traits/ObjectArray/ObjectArrayHashableTrait.php
Normal file
66
sources/traits/ObjectArray/ObjectArrayHashableTrait.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\ObjectArray;
|
||||
|
||||
use goodboyalex\php_components_pack\interfaces\IArrayable;
|
||||
use goodboyalex\php_components_pack\interfaces\IHashable;
|
||||
use goodboyalex\php_components_pack\interfaces\ISerializable;
|
||||
|
||||
/**
|
||||
* Часть кода класса ObjectArray, отвечающая за реализацию интерфейса IHashable.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.2
|
||||
*/
|
||||
trait ObjectArrayHashableTrait
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function Hash (): string
|
||||
{
|
||||
// Создаю массив хешей всех объектов
|
||||
$toHash = [];
|
||||
|
||||
// Перебираю все объекты в массиве
|
||||
foreach ($this->Container as $object) {
|
||||
// - если объект реализует интерфейс IHashable
|
||||
if ($object instanceof IHashable) {
|
||||
// -- то хэширую его и добавляю в массив
|
||||
$toHash[] = $object->Hash();
|
||||
|
||||
// -- переходим к следующему элементу
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если объект реализует интерфейс ISerializable
|
||||
if ($object instanceof ISerializable) {
|
||||
// -- то сериализую его и добавляю в массив
|
||||
$toHash[] = $object->Serialize();
|
||||
|
||||
// -- переходим к следующему элементу
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если объект реализует интерфейс IArrayable
|
||||
if ($object instanceof IArrayable) {
|
||||
// -- то преобразую его в массив
|
||||
$array = $object->ToArray();
|
||||
|
||||
// -- сериализую его и добавляю в массив
|
||||
$toHash[] = json_encode($array, JSON_UNESCAPED_UNICODE);
|
||||
|
||||
// -- переходим к следующему элементу
|
||||
continue;
|
||||
}
|
||||
|
||||
// - иначе просто сериализую объект
|
||||
$toHash[] = serialize($object);
|
||||
}
|
||||
|
||||
// Возвращаю хеш массива
|
||||
return md5(json_encode($toHash, JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
@@ -63,12 +63,12 @@ trait ObjectArraySearchAndSortTrait
|
||||
/**
|
||||
* Сортирует массив объектов, по значению свойства объекта.
|
||||
*
|
||||
* @param string $objectProperty Имя свойства объекта
|
||||
* @param string $property Имя свойства объекта
|
||||
* @param bool $descending Направление сортировки
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function Sort (string $objectProperty, bool $descending = false): void
|
||||
public function Sort (string $property = '', bool $descending = false): void
|
||||
{
|
||||
// Создаём результирующий массив
|
||||
$result = array_merge($this->Container, []);
|
||||
@@ -77,8 +77,8 @@ trait ObjectArraySearchAndSortTrait
|
||||
usort($result,
|
||||
fn ($a, $b)
|
||||
=> !$descending
|
||||
? $a->$objectProperty <=> $b->$objectProperty
|
||||
: $b->$objectProperty <=> $a->$objectProperty);
|
||||
? $a->$property <=> $b->$property
|
||||
: $b->$property <=> $a->$property);
|
||||
|
||||
// Присваиваем результат
|
||||
$this->Container = $result;
|
||||
|
Reference in New Issue
Block a user