b1tc0re/sitemap

View on GitHub
src/Models/LocationCollection.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace DeftCMS\Components\b1tc0re\Sitemap\Models;

use Countable;
use IteratorAggregate;
use Traversable;

/**
 * @author        b1tc0re
 * @copyright   2020-2021 DeftCMS (https://deftcms.ru/)
 *
 * @since        Version 0.0.9a
 */
class LocationCollection implements IteratorAggregate, Countable
{
    /**
     * Колекция.
     *
     * @var array
     */
    private $items = [];

    /**
     * Количество элементов.
     *
     * @var int
     */
    private $count = 0;

    /**
     * LocationCollection constructor.
     *
     * @param array $items
     */
    public function __construct(array $items = [])
    {
        $this->items = $items;
        $this->count = count($items);
    }

    /**
     * Retrieve an external iterator.
     *
     * @link  https://php.net/manual/en/iteratoraggregate.getiterator.php
     *
     * @return Traversable An instance of an object implementing <b>Iterator</b> or
     *                     <b>Traversable</b>
     *
     * @since 5.0.0
     */
    public function getIterator()
    {
        return new \ArrayIterator($this->items);
    }

    /**
     * Добавить новый адрес если он не сушествует
     *
     * @param UrlModel $value
     */
    public function addNotExist(UrlModel $value)
    {
        if (false === $this->exist($value)) {
            $this->add($value);
        }
    }

    /**
     * Добавить новый адрес если он не сушествует
     *
     * @param UrlModel $value
     */
    public function addUpdateExist(UrlModel $value)
    {
        if (false !== ($index = $this->search($value))) {
            $this->items[$index] = $value;
        } else {
            $this->add($value);
        }
    }

    /**
     * Добавить новый адрес
     *
     * @param UrlModel $value
     */
    public function add(UrlModel $value)
    {
        $this->count++;
        $this->items[$value->getLocation()] = $value;
    }

    /**
     * Удалить элемент
     *
     * @param UrlModel $value
     */
    public function remove(UrlModel $value)
    {
        if (false !== ($index = $this->search($value))) {
            unset($this->items[$index]);
            $this->count--;
        }
    }

    /**
     * Количество элементов.
     *
     * @return int
     */
    public function count()
    {
        return $this->count;
    }

    /**
     * Проверить если есть указанная карта.
     *
     * @param UrlModel $value
     *
     * @return bool
     */
    public function exist(UrlModel $value)
    {
        return $this->search($value) !== false;
    }

    /**
     * Разбивает колекцию на части.
     *
     * @param int $length - Количество элементов в массиве
     * @param int $chunks - Количество массивов
     *
     * @return LocationCollection[]
     */
    public function chunk(int $length, &$chunks = 0)
    {
        if ($this->count() <= $length) {
            return [$this];
        }

        $collections = [];

        foreach (array_chunk($this->items, $length, true) as $chunk) {
            $collections[] = new self($chunk);
        }

        $chunks = count($collections);

        return $collections;
    }

    /**
     * Получить первый элемент
     *
     * @return UrlModel
     */
    public function first()
    {
        return current($this->items);
    }

    /**
     * Получить индекс найденого элемента.
     *
     * @param UrlModel $element
     *
     * @return string|false
     */
    public function search(UrlModel $element)
    {
        if (isset($this->items[$element->getLocation()])) {
            return $element->getLocation();
        }

        return false;
    }
}