[+] Добавлен новый тип GUID. [*] В класс ObjectArray добавлена реализация интерфейсов IHashable, ISortable, IComparable. [*] В класс Dictionary добавлена реализация интерфейсов IArrayable, IHashable, ISortable, IComparable. [-] Класс GUIDExtension и все его методы помечены как устаревшие и скоро будут удалены.
89 lines
3.0 KiB
PHP
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);
|
|
}
|
|
} |