php_components_pack/sources/traits/ObjectArray/ObjectArrayComparableTrait.php
babaev-an 24bf2a009f 20250724 1.2
[+] Добавлен новый тип GUID.

[*] В класс ObjectArray добавлена реализация интерфейсов IHashable, ISortable, IComparable.

[*] В класс Dictionary добавлена реализация интерфейсов IArrayable, IHashable, ISortable, IComparable.

[-] Класс GUIDExtension и все его методы помечены как устаревшие и скоро будут удалены.
2025-07-24 13:02:04 +03:00

89 lines
3.0 KiB
PHP

<?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);
}
}