170 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace WapplerSystems\Meilisearch\System\Data;
 | 
						|
 | 
						|
/*
 | 
						|
 * This file is part of the TYPO3 CMS project.
 | 
						|
 *
 | 
						|
 * It is free software; you can redistribute it and/or modify it under
 | 
						|
 * the terms of the GNU General Public License, either version 2
 | 
						|
 * of the License, or any later version.
 | 
						|
 *
 | 
						|
 * For the full copyright and license information, please read the
 | 
						|
 * LICENSE.txt file that was distributed with this source code.
 | 
						|
 *
 | 
						|
 * The TYPO3 project - inspiring people to share!
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * Class AbstractCollection
 | 
						|
 */
 | 
						|
abstract class AbstractCollection implements \IteratorAggregate, \Countable, \ArrayAccess
 | 
						|
{
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $data = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param array $data
 | 
						|
     */
 | 
						|
    public function __construct(array $data = [])
 | 
						|
    {
 | 
						|
        $this->data = $data;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function clean()
 | 
						|
    {
 | 
						|
        $this->data = [];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method can be used to pass a closure to created a filtered copy.
 | 
						|
     * The closure get an collection item passed and needs to return true when the item should
 | 
						|
     * be kept or false when it can be skipped.
 | 
						|
     *
 | 
						|
     * @param callable $filter
 | 
						|
     * @return AbstractCollection
 | 
						|
     */
 | 
						|
    public function getFilteredCopy(\Closure $filter)
 | 
						|
    {
 | 
						|
        $copy = clone $this;
 | 
						|
        $filteredData = [];
 | 
						|
        foreach ($this->data as $key => $item) {
 | 
						|
            if ($filter($item)) {
 | 
						|
                $filteredData[$key] = $item;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        $copy->data = $filteredData;
 | 
						|
        return $copy;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return \ArrayIterator|\Traversable
 | 
						|
     */
 | 
						|
    public function getIterator()
 | 
						|
    {
 | 
						|
        return new \ArrayIterator($this->data);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function getArrayCopy()
 | 
						|
    {
 | 
						|
        return $this->data;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param int $position
 | 
						|
     * @return Object
 | 
						|
     */
 | 
						|
    public function getByPosition($position)
 | 
						|
    {
 | 
						|
        $keys = array_keys($this->data);
 | 
						|
        return isset($this->data[$keys[$position]]) ? $this->data[$keys[$position]] : null;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * (PHP 5 >= 5.1.0)<br/>
 | 
						|
     * Count elements of an object
 | 
						|
     * @link http://php.net/manual/en/countable.count.php
 | 
						|
     * @return int The custom count as an integer.
 | 
						|
     * </p>
 | 
						|
     * <p>
 | 
						|
     * The return value is cast to an integer.
 | 
						|
     */
 | 
						|
    public function count()
 | 
						|
    {
 | 
						|
        return count($this->data);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return int
 | 
						|
     */
 | 
						|
    public function getCount()
 | 
						|
    {
 | 
						|
        return $this->count();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Whether a offset exists
 | 
						|
     *
 | 
						|
     * @param mixed $offset
 | 
						|
     * @return bool true on success or false on failure
 | 
						|
     */
 | 
						|
    public function offsetExists($offset)
 | 
						|
    {
 | 
						|
        return array_key_exists($offset, $this->data);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Offset to retrieve
 | 
						|
     *
 | 
						|
     * @param mixed $offset
 | 
						|
     * @return mixed
 | 
						|
     */
 | 
						|
    public function offsetGet($offset)
 | 
						|
    {
 | 
						|
        if ($this->offsetExists($offset)) {
 | 
						|
            return $this->data[$offset];
 | 
						|
        } else {
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Offset to set
 | 
						|
     *
 | 
						|
     * @param mixed $offset
 | 
						|
     * @param mixed $value
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function offsetSet($offset, $value)
 | 
						|
    {
 | 
						|
        if ($offset === null) {
 | 
						|
            $this->data[] = $value;
 | 
						|
            return;
 | 
						|
        }
 | 
						|
        $this->data[$offset] = $value;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Offset to unset
 | 
						|
     *
 | 
						|
     * @param mixed $offset
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function offsetUnset($offset)
 | 
						|
    {
 | 
						|
        if ($this->offsetExists($offset)) {
 | 
						|
            unset($this->data[$offset]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |