O que é?
A biblioteca das Collections é uma das coisas mais úteis na maioria das linguagens modernas, mas por alguma razão o PHP ainda não tem essa funcionalidade como algo padrão. Sim, no PHP temos os poderosos arrays, mas eles têm uma API muito dispersa e trabalhosa para usarmos.
Por essa razão, foi criado o componente Collections, uma incrível biblioteca que reúne as melhores práticas adotadas nas coleções do .NET e Java trabalhando em conjunto com o poder dos arrays do PHP.
Vamos brincar um pouco com essa biblioteca e ver o que ela pode fazer.
Instalação
O componente Collections está disponível para instalação através do composer. Então, para começar, crie no seu projeto um arquivo chamado composer.json e adicione as linhas abaixo:
{
    "autoload": {
        "psr-0": {
            "": ""
        }
    },
    "minimum-stability": "dev",
    "require": {
        "easyframework/collections": "2.1.*"
    }
}
Feito isso, podemos rodar nossa instalação; se você já instalou o composer, vá no seu terminal (linha de comando), navegue até a pasta do seu projeto e rode o seguinte comando:
$ composer install
Uso
A classe Collection
A classe Collection representa a classe List no .NET ou ArrayList no Java. Ela é baseada nos simples arrays não associativos do PHP. Vamos aprender como utilizá-la e adicionar alguns elementos a ela:
$collection = new \Easy\Collections\Collection();
$collection->add('John');
$collection->add('Maria');
$collection->add('Anderson');
foreach($collection as $item){
    echo $item;
}
Simples, não? Vamos continuar com nosso exemplo e contar quantos elementos nós temos nessa coleção.
echo $colletion->count();
Ótimo, agora nós sabemos como adicionar elementos e contá-los na coleção, mas isso é muito simples, qualquer array faz essa tarefa. Então vamos melhorar as coisas: que tal nós ordenarmos os elementos da coleção através de alguma regra? Por exemplo, primeiramente eu quero ordená-los pela ordem natural dos números e depois por ordem alfabética. Vejamos:
$collection->sort(); //por padrão a ordenção é pelas chaves //isso irá ordenar a coleção por ordem alfabética $colletion->sort(new \Easy\Collections\Comparer\StringComparer()); //aqui você pode criar o seu comparador para ordenar coleções pelo seu critério $collection->sort(new YourCustomComaparer());
Agora sim, algo útil. Nós podemos por exemplo criar um ordenador para uma coleção de datas, no qual inserimos apenas datas e ordenamos pela mais recente. Bem, nós podemos fazer muito mais coisas, vamos buscar algum elemento agora:
print_r($collection>contains("John")); //retorna true
Certo, agora que nós sabemos diversas coisas sobre a classe collection, acho que estamos prontos para passar para o próximo tipo de coleção chamada Dictionary.
A classe Dictionary
A classe Dictionary se baseia nos arrays associativos do PHP. Vamos criar um dicionário de pessoas, no qual vamos incluir uma chave e um valor. A chave será o número da pessoa, e o valor será o um array com o nome e a idade dela.
$dictionary = new \Easy\Collections\Dictionary();
$dictionary->add('person1', array(
    'name' => 'John',
    'age' => 20
));
$dictionary->add('person2', array(
    'name' => 'Maria',
    'age' => 19
));
$dictionary->add('person3', array(
    'name' => 'Anderson',
    'age' => 25
));
foreach ($dictionary as $key => $item) {
    echo $key . ": " . $item['name'] . "-" . $item['age'];
}
Uma observação: quando uma chave é inserida, ela não pode se repetir, ou seja, você não poderá incluí-la novamente. Caso você queira alterar o valor daquela chave, deverá utilizar o método set(). Aqui está um exemplo de como alterar uma chave:
$dictionary->set('person1', array('John', 30));
Agora veja como podemos pegar esse elemento pela chave:
//retorna array('name' => John, 'age' => 30)
print_r ($dictionary->getItem('person1'));
Todos os métodos da classe Collection estão disponíveis na classe Dictionary, apenas lembre-se de usá-las em seus devidos locais, ou seja, use o dicionário quando precisar trabalhar com algo com chave e valor.
Outras classes
Ainda temos diversas outras classes para trabalharmos na biblioteca, não vou mostrar todas aqui, mas veja algumas das principais:
- Collection – Uma coleção genérica para elementos
 - Dictionary – Uma coleção genérica para elementos com chave e valor
 - Queue – Representa uma fila e segue o padrão FIFO (First in First out)
 - Stack – Representa uma pilha e segue o padrão LIFO (Last in First out)
 - CollectionBase – Base para todas as coleções; você pode herdá-la para criar suas próprias coleções
 
Trabalhando com objetos
Deixei o melhor para o final, vamos trabalhar com alguns objetos. Seguindo nosso exemplo anterior, vamos criar uma classe Person. Para isso, crie um arquivo Person.php no seu projeto e não se preocupe com o ‘require’, já que o composer carrega automaticamente essa classe para nós:
<?php
class Person
{
    private $name;
    private $age;
    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }
    public function getName()
    {
        return $this->name;
    }
    public function setName($name)
    {
        $this->name = $name;
    }
    public function getAge()
    {
        return $this->age;
    }
    public function setAge($age)
    {
        $this->age = $age;
    }
}
Agora que temos nossa classe, vamos instanciar uma nova coleção e adicionar 6 pessoas a ela:
$collection = new \Easy\Collections\Collection();
$collection->add(new Person('John', 20));
$collection->add(new Person('Peter', 20));
$collection->add(new Person('Sophie', 21));
$collection->add(new Person('Angela', 29));
$collection->add(new Person('Maria', 19));
$collection->add(new Person('Anderson', 25));
foreach($collection as $item){
    echo $item->getName();
}
Muito simples. A razão pela qual eu quis mostrar isso é por causa da Expression search API, uma API muito parecida com o LINQ para o.NET, que nos permite fazer buscas com a semântica SQL nas coleções. Vejamos um exemplo – nessa mesma coleção, eu gostaria de mostrar apenas as pessoas que têm 20 anos de idade:
$criteria = new \Easy\Collections\Criteria();
$expr = $criteria->expr()->eq("age", 20);
$criteria->where($expr);
$collection = $collection->matching($criteria);
//só irá listar John e Peter
foreach($collection as $item){
    echo $item->getName() . "-" . $item->getAge();
}
Agora, vamos listar todo mundo cujo nome começa com a letra “A”:
$criteria = new \Easy\Collections\Criteria();
$expr = $criteria->expr()->contains("name", "A");
$criteria->where($expr);
$collection = $collection->matching($criteria);
//irá listar apenas Angela e Anderson
foreach($collection as $item){
    echo $item->getName() . "-" . $item->getAge();
}
Veja como é simples realizar consultas mais complexas nas coleções com essa API. Na forma normal, nós teríamos que percorrer a coleção completa e fazer alguns ‘ifs’ e ‘strstr()’ para encontrarmos esse resultado. Temos muitas outras coisas que podemos usar nesse componente, então não deixe de explorá-lo.
Conclusão
Espero que você tenha gostado do nosso tour pela Collections API. Você pode estar se perguntando o porquê de usar essa biblioteca, e a resposta é muito simples…. Simplicidade, organização e padronização. Minha intenção é só mostrar uma ferramenta útil para você ganhar produtividade.
Eu sou o responsável pelo desenvolvimento da biblioteca e ainda temos muito o que melhorar nela, é por isso que peço sua ajuda para construí-la, seja com documentação ou codificando mesmo!!
Link para o repositório no Github: https://github.com/LellysInformatica/collections
Não se esqueça de dar uma olhada na documentação da API.



