Alura > Cursos de Programação > Cursos de PHP > Conteúdos de PHP > Primeiras aulas do curso PHP: dominando as Collections

PHP: dominando as Collections

Intimidade com arrays - Apresentação

Olá, pessoal! Boas-vindas à Alura! Eu sou o Vinicius Dias e vou guiar vocês nesse treinamento de coleções, ou estruturas de dados, usando PHP.

Nesse treinamento nós vamos aprender que array nem sempre é a melhor resposta para tudo. Afinal de contas, um array em PHP não é, na verdade, o que normalmente conhecemos como array, ou seja, um vetor.

Então, vamos entender o que é um array, na prática, e aprender que são utilizados para tudo e para nada ao mesmo tempo e vamos aprender sobre alternativas ao array.

Então vamos começar falando sobre as estruturas de dados da SPL (Standard PHP Library). Vamos passar por praticamente todas essas coleções, algumas com mais detalhes do que outras, para entendermos o propósito e como utilizar cada uma.

Vamos acabar vendo alguns problemas dessa extensão SPL e, a partir desses problemas, vamos conhecer estruturas de dados mais eficientes - em específico, a extensão DS (Data Structures).

Nessa extensão, vamos passar um pouco mais rápido porque todos os conceitos nós já vamos ter aprendido, ou seja, vamos aprender os conceitos de cada tipo de coleção, de cada estrutura de dados e depois, no final, vamos utilizar uma implementação mais eficiente.

Então, nesse treinamento vamos ver porque não usar arrays e quando não usar, quais alternativas melhores e vamos ver na prática o array consumindo muita memória e outras estruturas consumindo bem menos. Isso vai ser bem legal para praticarmos.

Então espero que durante esse treinamento você aprenda bastante, mas se em algum momento eu correr muito e você ficar com alguma dúvida, não hesite, você pode abrir uma dúvida no fórum.

Eu tento responder pessoalmente sempre que possível, mas quando não consigo, nós temos uma comunidade muito assídua e ativa de moderadores, alunos e instrutores. Com certeza alguém vai conseguir te ajudar.

Mais uma vez, seja muito bem-vindo e te espero no próximo vídeo para já começarmos a colocar a mão na massa e entender a principal estrutura de dados do PHP, que é o array!

Intimidade com arrays - Operações com array

Olá, pessoal! Como vamos falar sobre coleções usando o PHP, vamos começar pela primeira coleção que devemos conhecer, que é a mais famosa inclusive: os arrays.

Lá no treinamento sobre programação funcional usando o PHP nós já aprendemos a manipular arrays, já conhecemos diversas funções de arrays. Então, já sabemos como filtrar, ordenar, mapear e reduzir um array a um único dado.

Mas vamos recapitular algumas coisas, vamos ver novas funções aqui só para termos muitos detalhes de arrays. Quando trabalhamos com PHP, não podemos chamar o array de “senhor array”, nós temos que ter uma certa intimidade com ele e chamá-lo de “amigão”.

Então, vamos criar uma intimidade a mais com o array aqui, relembrando alguns conceitos, aprendendo novas funções, etc. Então, vamos nessa! Eu vou criar aqui um “teste-cursos.php”.

Vamos pensar na Alura, eu estou criando um novo arquivo e aqui nós vamos ter listas de cursos, vamos ter uma coleção de cursos. De novo, a forma mais comum de armazenarmos uma coleção em PHP é usando um array, ou pelo menos o que chamamos de array em PHP – e vamos falar mais sobre isso.

Mas vamos lá! Eu vou ter aqui $cursos e posso criar arrays através da palavra array, colocando os valores entre aspas ou através de colchetes, são sinônimos. Mas beleza, isso aqui vocês já sabem.

Introdução ao PHP. Nós vamos criar alguns cursos aqui, vamos ter DDD com PHP e Coleções em PHP. Temos aqui três cursos, vamos começar pelo básico e aprender a adicionar itens nesse array, nessa lista, nessa coleção.

Então, com o PHP, como já sabemos também, eu posso simplesmente utilizar esse operador aqui, de abre e fecha colchetes: $cursos[]. Esse operador permite que adicionemos um item no final do array.

Então, vamos lá! Eu vou adicionar outro array aqui: Arrays em PHP. Eu tenho um novo curso aqui. Agora, se eu fizer um var_dump disso, de ($cursos) – deixe-me abrir o meu Terminal e executar isso – eu vou ter os meus quatro arrays com esse Array em PHP na última posição.

Já vimos uma forma de adicionarmos itens ao final de um array, só que existe outra forma. Vamos dar uma olhada aqui rapidamente nessa página. Nós temos a função array_push, que simplesmente adiciona um ou mais elementos no final do array.

Então, se você vir uma observação aqui, é a mesma coisa – onde está essa observação? Não vou achar agora porque estou te mostrando, mas tem uma observação que diz que é exatamente igual, o efeito é o mesmo que se nós fizéssemos isso daqui, abre e fecha colchetes.

A única diferença é que com a função array_push, eu consigo adicionar vários valores de uma vez só. Então, por exemplo: se eu fizer array_push(&array: $cursos e vários valores aqui, vamos adicionar alguns. Por exemplo: Orientação a Objetos e Object Calisthenics com PHP.

Eu passei mais de um valor aqui por parâmetro. Eu vou quebrar a linha para você conferir. Eu não estou passando outro array aqui nem nada do tipo, o que estou fazendo é passar realmente vários valores. Eu posso passar um monte de valores aqui.

No final das contas, quando eu executar isso daqui de novo, eu vou ter esses dois itens lá no final, ou seja, o array_push me permite adicionar mais itens no final.

E de novo, se eu quisesse, por exemplo, ao invés de pegar valores separados, se eu quisesse pegar um array de, por exemplo, $cursosOo em PHP, eu tenho esses dois cursos aqui, deixe-me pegá-los.

Vou tirar daqui e trazer para cá. Imagine que eu queira pegar os itens desse array e juntar com os itens desse array para gerar um novo array. O que eu posso fazer? Eu posso ter aqui um $novoArray que vai ser a junção desses dois.

Uma das palavras para “junção” em inglês é merge, para fazer o merge de dois arrays, unir dois arrays. Então escrevo array_merge e aqui eu passo quantos arrays eu quero unir.

Vou ter ($cursos, $cursosOo) e aqui no final esse nosso ($novoArray) vai ter todos os cursos. Um detalhe importante para nos atentarmos – deixe-me primeiro rodar aqui para garantir que esteja funcionando – chamando essa função, as chaves podem não ser mantidas.

Então, por exemplo: em Introdução ao PHPeu tenho a chave 0, emDDD com PHPeu tenho a chave 1 e emColeções em PHPeu tenho a chave 2, que são os índices do *array*. Em Orientação a Objetos eu tenho também 0 e em Object Calisthenics com PHP eu tenho 1. Ele vê que, como a chave 0 já existe, a partir do array anterior, o que ele vai fazer? Ele vai usar a primeira chave numérica disponível.

Então aqui nós já começamos a ver novas funções. Vamos ver mais alguma. Por exemplo: se eu quiser pegar o primeiro elemento do array - ou então, mesmo que eu quiser ignorá-lo, mas também quiser remover o primeiro elemento de um array.

O que eu posso fazer? Vou manipular esse $novoArray aqui. Eu quero pegar esse curso de $intro, de introdução. Eu posso fazer um array_shift desse novo $novoArray. O que isso vai fazer? O que quer dizer fazer um shift?

Imagine que eu tenho essa lista aqui, 1, 2, 3, 4. Fazer o shift significa mover essa lista, e ela vai mover para a esquerda. Então, na prática, se eu tenho essa lista e eu a movo para a esquerda, eu acabo removendo esse primeiro. Eu tiro o 1 e pego tudo que estava no final e trago para frente. Eu faço uma mudança de posição nesse array.

Então como eu movi tudo, eu tirei o primeiro elemento e o retornei. Tenho aqui, nessa variável, nesse retorno, esse item que eu removi. Vamos dar uma olhada na nossa ($intro), que deve ser Introdução ao PHP.

Já o $novoArray deve ser o array de todos os cursos sem o curso de introdução. Então, vamos dar uma olhada! Aqui eu tenho Introdução ao PHP e depois eu tenho um array reordenado, ou seja, com as chaves reorganizadas sem aquele primeiro, começando diretamente do DDD com PHP.

Se eu consigo pegar o primeiro, eu também consigo pegar o último. É isso que significa fazer um pop de um array. Voltando para aquele nosso exemplo da lista – deixe-me criar aqui o exemplo - 1, 2, 3, 4. Fazer um pop seria isso aqui.

Pegar o último elemento e manter o resto da frente intacto. Então, ao invés de fazer um array_shift, eu vou fazer um array_pop. Então eu tenho aqui, no meu $intro, não vai ser mais o curso de Introdução, vai ser o curso de Object Calisthenics com PHP.

E o meu $novoArray vai ter todos os treinamentos menos esse Object Calisthenics com PHP. Então, vamos executar! Finalizamos com Orientação a Objetos, então não tem o Object Calisthenics com PHP e eu tenho aqui o valor da minha variável $intro como sendo Object Calisthenics com PHP.

Para finalizarmos, porque estou mostrando um monte de funções aqui, vamos ver como inserir um item no início do array, porque já vimos como colocar o item no final, mas para adicionarmos o item no início do array, nós podemos utilizar o array_unshift.

Então, o shift é remover o primeiro item. O unshift é adicionar o item no início, ou vários itens no início. Vou pegar aqui, ao invés de fazer esse array_pop, o que eu posso fazer?

Chamar essa função array_unshift passando o $array e quantos valores eu quiser adicionar no início. Então vou digitar array_unshift e desse $novoArray, eu vou adicionar ...values: ‘Instalando PHP’. Só estou criando nomes aqui.

Então, agora, quando eu fizer o var_dump desse ($novoArray), ele vai ter esse Instalando PHP no início. Vamos ver aqui. Instalando PHP é o nosso primeiro item e ele reorganizou tudo.

Então, de novo, o unshift seria fazer isso daqui. Eu tenho essa lista 1, 2, 3, 4, eu vou adicionar um item e mover todos os outros, 0, 1, 2, 3, 4. Vou fazer o unshift de todos os outros.

Então, OK, eu falei bastante. São várias funções aqui, funções simples e tranquilas de entender, por isso eu dei uma corrida. Mas não tem como eu falar tudo sobre arrays, porque são muitas coisas. Dê uma olhada nesse meu lado direito da tela, quantas funções de array existem!

Existem muitas funções, muitas! Seria impossível criar um curso só para falar de todas essas funções, nós precisaríamos de vários. Mas, honestamente, nós não precisamos de um treinamento inteiro para vermos todas essas funções.

Por quê? Se você precisa manipular, de alguma forma, um array, a primeira coisa que você vai fazer é pesquisar nessa lista de funções de array.

“Eu quero remover todos os itens duplicados de um array”, nós podemos pesquisar aqui, “array_unique”. Existe, “eu quero ver a diferença, os itens que têm em um array e não em outro”. Nós temos “array_diff”, temos várias variantes dessa função “array_diff”...

Então, enfim, existem muitas funções para criar, modificar itens de array e remover itens de array. Enfim, tem muitas coisas para estudar, mas eu vou encerrar por aqui essa introdução sobre arrays.

Agora, como eu falei no início desse vídeo, eu disse que nós estávamos falando sobre o que nós conhecemos em PHP como array, essa estrutura aqui, essa coleção que estamos trabalhando.

Mas por que eu falei isso? O que isso quer dizer? Vamos entender no próximo vídeo, por alto, o que é na prática um array em PHP.

Intimidade com arrays - Array ou hash map?

Olá, pessoal! Boas-vindas de volta! Eu já abri aqui a documentação do PHP na parte sobre arrays, onde ele explica esse tipo de dado.

Um array, em várias outras linguagens – e acredito, me arrisco a dizer que em todas as linguagens estaticamente tipadas, pelo menos – é um outro nome para “vetor”, quando nós falamos de computação.

Ou seja, um vetor seria, um espaço de memória contínuo, sendo alocado para determinado valor que nós queremos adicionar lá.

Então, por exemplo: eu vou tentar explicar no código. Imagine que eu crio, em PHP, um $array = [1, 2, 3, 4, 5,]. Criei esse array. Em linguagens onde o array é um vetor, o que aconteceria aqui, por baixo dos panos? Um espaço de memória para 5 inteiros seria armazenado na memória.

E esse espaço seria contínuo. Então, nós dividiríamos esse espaço de 5 inteiros em cinco partes, ou seja, uma parte para cada um dos valores. Se eu quisesse, por exemplo, acessar a terceira posição aqui, ou seja, o índice 2, eu simplesmente acessaria nesse ponto da memória.

Então, eu pego, do início da memória mais dois bytes - está aqui o nosso terceiro valor. Vamos lá! Por exemplo: se eu fizer isso $array[2]? Eu vou acessar a memória na posição do início desse vetor, ou seja, no início desse espaço de memória, e vou andar mais duas casas – dois bytes não é o termo correto.

Eu vou andar mais duas casas onde estamos armazenando esses inteiros. Então eu estou aqui no início. Andei uma casa, andei outra casa e encontrei esse valor. Ou seja, é rápido acessar aleatoriamente qualquer valor, eu consigo fazer cálculos de memória para saber onde vou acessar, através de ponteiros etc.

Não vou entrar em detalhes em como arrays são realmente armazenados, mas, por alto, essa é a ideia por trás de um vetor. Mas em PHP, como vemos logo nessa primeira frase aqui, em PHP um array é, na verdade, um mapa ordenado.

E o que isso quer dizer? Vamos lá! Eu não vou tentar explicar para vocês o conceito de mapa supercompleto agora, mas basicamente, um mapa é um mapeamento de um valor para outro.

Então eu tenho uma chave que me leva até um valor. Em PHP é fácil implementar isso. Por exemplo: a chave zero desse mapa de cursos leva para o valor ‘Introdução ao PHP’. Se eu quisesse, eu poderia ter, ao invés de inteiros, uma string aqui para servir como a chave desse valor.

Então, eu tenho um valor que nos leva até outro valor. Essa é a ideia, superficialmente falando, de um mapa.

E o PHP trabalha com arrays usando uma implementação de mapa ordenado, ou seja, quando eu crio um array e vou inserindo valores, ele armazena a ordem e ele garante que essa ordem existe para eu conseguir recuperar através de índices numéricos, etc.

Então o que o PHP faz por baixo dos panos não é armazenar um vetor, mas sim, criar uma estrutura de dados onde um valor é mapeado para outro. Isso é organizado de forma dinâmica na memória. Por que isso é feito?

Porque, dessa forma, nós conseguimos ter isso daqui tudo, esse monte de funções. Então existe uma frase bastante famosa, que infelizmente eu não conheço o autor, que diz que arrays em PHP são otimizados para tudo e para nada ao mesmo tempo.

Ou seja, se você só quer realizar um trabalho com uma coleção, sem importar se esse trabalho está sendo feito da melhor forma, em questões de performance, legibilidade, semântica ou o que for, o array vai te atender, muito provavelmente, muito bem.

Então como aqui na documentação diz dessa forma, nós podemos tratá-lo como um array, como uma lista – que é o que temos feito aqui – como uma tabela de espalhamento – que é uma implementação de mapa, ou seja, os arrays associativos, por exemplo.

Um dicionário – que é o array associativo realmente – uma coleção qualquer, uma pilha, uma fila. Enfim, uma série de estruturas de dados. Só que, de novo, segundo aquela frase: arrays em PHP são otimizados para tudo e para nada ao mesmo tempo.

Então, o que vamos fazer? Primeiro, eu vou deixar aqui no “para saber mais” o link de um podcast que fala especificamente sobre essa estrutura de mapa; especificamente falando sobre tabela de espalhamento, ou hash table.

Então essa implementação aqui é o que o PHP faz por baixo dos panos, uma hash table. Vou deixar um podcast do Hipsters.Tech, que fala especificamente sobre essa estrutura de dados. Dessa forma, você vai ter uma leve noção de como o PHP armazena coisas por baixo dos panos.

E com isso, você vai entender o motivo para que arrays em PHP sejam otimizados para tudo, mas para nada ao mesmo tempo. Então, por exemplo: se eu preciso lidar com grandes quantidades de dados e se eu preciso de velocidade, ou se eu preciso poupar recursos e não armazenar muita memória - talvez utilizar arrays não seja a melhor saída.

E é exatamente esse o propósito do treinamento: te mostrar alternativas mais interessantes quando nós nos preocupamos realmente com a semântica; para utilizarmos uma lista onde precisamos de uma lista e um mapa onde precisamos de um mapa, e não só array.

Para falarmos de performance, para que consigamos poupar memória e executarmos o nosso código de forma mais rápida quando estamos lidando com muitos dados. Enfim, vamos entender como trabalhar com as estruturas corretas para determinados casos, e não simplesmente usarmos array para tudo.

Então, entendido o propósito desse treinamento, relembrando o conceito de arrays em PHP e entendendo por baixo dos panos como o array é implementando no PHP; nós vamos começar finalmente falando de outras estruturas de dados!

Ou seja, alternativas a esse tal de array - isso que já vimos que pode não ser o ideal. Só que vamos começar essa parte no próximo capítulo!

Sobre o curso PHP: dominando as Collections

O curso PHP: dominando as Collections possui 145 minutos de vídeos, em um total de 52 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas