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