Coleções PHP

O que é isso?

A biblioteca de coleções é uma das coisas mais úteis na maioria das linguagens modernas, mas por alguma razão o PHP não tem essa funcionalidade como padrão. Sim, temos os poderosos arrays PHP, mas eles têm uma API muito dispersa e trabalhosa para usarmos.

Por isso, criamos PHP Collections, uma incrível biblioteca que reúne as melhores práticas adotadas em coleções. NET e Java trabalhando juntos com o poder dos arrays PHP.

Vamos brincar um pouco com essa biblioteca e ver o que ela pode fazer.

Instalação

As coleções do PHP estão disponíveis para instalação por meio do compositor . Portanto, para começar, crie um arquivo em seu projeto chamado composer.json e adicione as seguintes linhas:

{
"autoload": {
"psr-0": {
"": ""
}
},
"minimum-stability": "dev",
"require": {
"easyframework/collections": "2.1.*"
}
}

Feito isso, podemos executar nossa instalação, caso você já tenha instalado o composer, vá até o seu terminal (linha de comando), navegue até a pasta do seu projeto e execute o seguinte comando:

$ composer install

Uso

A classe Collection

A classe Collection é equivalente à classe List em .NET ou ArrayList em Java. É baseado em matrizes simples não associativas do PHP. Vamos aprender como usá-lo e adicionar alguns elementos a ele:

$collection = new EasyCollectionsCollection();
$collection
->add('John');
$collection
->add('Maria');
$collection
->add('Anderson');

foreach($collection as $item){
echo $item
;
}

Simples, certo? Vamos continuar com nosso exemplo e contar quantos elementos temos nesta coleção.

echo $colletion->count();

Ótimo, agora sabemos como adicionar e contar os elementos da coleção, mas isso é muito simples, qualquer array faz essa tarefa.

Então, vamos melhorar as coisas: que tal ordenarmos os elementos da coleção por meio de alguma regra? Por exemplo, primeiro quero classificá-los na ordem dos números naturais e depois em ordem alfabética. Considerar:

$collection->sort(); //by default the collection order is by keys
//This will order alphabetically
$colletion
->sort(new EasyCollectionsComparerStringComparer());

//here you can create your custom comparer
$collection
->sort(new YourCustomComaparer());

Sim, agora temos algo útil. Podemos, por exemplo, criar um comparador para uma coleção de datas em que inserimos datas e ordenamos pela mais recente. Bem, podemos fazer muito mais. Agora vamos obter alguns elementos da coleção:

print_r($collection>contains("John")); //returns true

Ok, agora que sabemos muitas coisas sobre a classe Collection, acho que estamos prontos para avançar para o próximo tipo de coleção chamado Dicionário.

Trabalhar com objetos

Vamos trabalhar com alguns objetos. Seguindo nosso exemplo anterior, criaremos uma classe Person. Para fazer isso, crie um arquivo no seu projeto Person.php e não se preocupe com o ‘require’, pois o compositor o carrega automaticamente para nós:

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, instanciamos uma nova coleção e adicionamos 6 pessoas:

$collection = new EasyCollectionsCollection();

$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();
}

Bem simples. Eu queria mostrar isso porque a API de pesquisa de expressão é muito semelhante à API LINQ do .NET, que permite pesquisar com semântica SQL em coleções.
Aqui está um exemplo, eu gostaria de mostrar apenas as pessoas que têm 20 anos:

$criteria = new EasyCollectionsCriteria();
$expr
= $criteria->expr()->eq("age", 20);
$criteria
->where($expr);
$collection
= $collection->matching($criteria);

//will list John e Peter
foreach($collection as $item){
echo $item
->getName() . "-" . $item->getAge();
}

Agora, vamos listar todos cujos nomes começam com a letra “A”:

$criteria = new EasyCollectionsCriteria();
$expr
= $criteria->expr()->contains("name", "A");
$criteria
->where($expr);
$collection
= $collection->matching($criteria);

//will list Angela e Anderson
foreach($collection as $item){
echo $item
->getName() . "-" . $item->getAge();
}

Veja como é simples realizar consultas mais complexas em coleções com esta API. Na forma normal, teríamos que percorrer a coleção completa, fazer alguns ‘ifs’ e ‘strstr ()’ para encontrar o resultado. Temos muitas outras coisas que podemos usar neste componente, portanto, certifique-se de explorá-lo.

Outras aulas

Ainda temos várias outras classes para trabalhar na biblioteca, não vou mostrar todas aqui, mas aqui estão algumas das chaves:

  • Coleção – Uma coleção de elementos genéricos
  • Dicionário – uma coleção genérica de elementos com chave e valor
  • Fila – representa uma linha e segue o padrão FIFO (primeiro a entrar, primeiro a sair)
  • Pilha – Representa uma pilha e segue o LIFO padrão (último a entrar, primeiro a sair)
  • CollectionBase – Base para todas as coleções, você pode herdá-la para criar suas próprias coleções

Conclusão

Espero que tenha gostado do nosso tour pela API de coleções. Você pode estar se perguntando por que usar esta biblioteca, e a resposta é muito simples … Simplicidade, organização e padronização. Minha intenção é apenas mostrar a você uma ferramenta útil para ganhar produtividade.

Sou responsável pelo desenvolvimento da biblioteca e ainda tenho muito a melhorar, por isso peço sua ajuda para construí-la, com documentação e codificação é a mesma!

Link para o repositório Github: https://github.com/LellysInformatica/collections

Não se esqueça de dar uma olhada na documentação da API.