Fundamentos do PHP

0/25 aulas0%
pratica

Iterando Arrays com foreach e funções de array

Aprenda sobre iterando arrays com foreach e funções de array

40 min
Aula 5 de 5

Iterando Arrays com foreach e Funções de Array

Olá, futuro(a) mestre em PHP! 👋 Nesta aula prática, vamos mergulhar em uma das operações mais fundamentais e frequentes ao trabalhar com dados em PHP: a iteração de arrays. Arrays são estruturas de dados poderosas, e saber como percorrê-los e manipulá-los eficientemente é crucial para qualquer desenvolvedor PHP.

Vamos explorar o laço foreach, a ferramenta mais comum para essa tarefa, e também algumas funções de array poderosas que nos permitem realizar operações complexas com poucas linhas de código. Prepare-se para colocar a mão na massa! 🚀

1. Introdução: Por Que Iterar Arrays?

Imagine que você tem uma lista de usuários, produtos em um carrinho de compras, ou resultados de um banco de dados. Todos esses cenários envolvem arrays, e você precisará:

  • Exibir cada item.
  • Calcular um total.
  • Filtrar itens com base em uma condição.
  • Modificar cada item de alguma forma.

Para todas essas tarefas, a iteração é a chave! Nesta aula, vamos focar em duas abordagens principais:

  1. foreach: O laço mais idiomático para percorrer arrays.
  2. Funções de Array: Funções built-in do PHP que oferecem maneiras concisas e otimizadas de manipular arrays.

Vamos começar!

2. O Laço foreach

O foreach fornece uma maneira fácil de iterar sobre arrays e objetos. É a forma mais recomendada para percorrer arrays no PHP, sendo mais legível e menos propenso a erros do que os laços for tradicionais para arrays.

2.1. Sintaxe Básica

Existem duas formas principais de usar o foreach:

Forma 1: Apenas o Valor (foreach ($array as $value))

Esta forma itera sobre o array, atribuindo o valor de cada elemento à variável $value em cada iteração.

<?php
$cores = ["vermelho", "azul", "verde", "amarelo"];
 
echo "Minhas cores favoritas são:\n";
foreach ($cores as $cor) {
    echo "- " . $cor . "\n";
}
?>

Saída:

Minhas cores favoritas são:
- vermelho
- azul
- verde
- amarelo

Forma 2: Chave e Valor (foreach ($array as $key => $value))

Esta forma é útil quando você precisa acessar tanto a chave (índice) quanto o valor de cada elemento do array.

<?php
$usuario = [
    "nome" => "Alice",
    "idade" => 30,
    "cidade" => "São Paulo"
];
 
echo "Detalhes do Usuário:\n";
foreach ($usuario as $chave => $valor) {
    echo ucfirst($chave) . ": " . $valor . "\n";
}
?>

Saída:

Detalhes do Usuário:
Nome: Alice
Idade: 30
Cidade: São Paulo

2.2. Exemplo Oficial da Documentação

A documentação do PHP ilustra bem a flexibilidade do foreach:

<?php
/* Exemplo 1: Array simples */
$array = array(1, 2, 3, 6, 7, 8);
 
echo "Exemplo 1:\n";
foreach ($array as $value) {
    echo "Value: " . $value . "\n";
}
 
/* Exemplo 2: Array associativo */
$array = array("um" => 1, "dois" => 2, "tres" => 3);
 
echo "\nExemplo 2:\n";
foreach ($array as $key => $value) {
    echo $key . " => " . $value . "\n";
}
 
/* Exemplo 3: Alterando o valor do array */
$array = array(1, 2, 3);
 
echo "\nExemplo 3 (antes da modificação):\n";
print_r($array);
 
foreach ($array as &$value) { // Note o '&' para passar por referência
    $value = $value * 2;
}
unset($value); // Quebra a referência com o último elemento
 
echo "Exemplo 3 (depois da modificação):\n";
print_r($array);
?>

Saída:

Exemplo 1:
Value: 1
Value: 2
Value: 3
Value: 6
Value: 7
Value: 8

Exemplo 2:
um => 1
dois => 2
tres => 3

Exemplo 3 (antes da modificação):
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

Exemplo 3 (depois da modificação):
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
)

⚠️ Importante sobre &$value: Quando você usa & antes da variável $value (foreach ($array as &$value)), você está iterando por referência. Isso significa que qualquer modificação em $value dentro do loop afetará diretamente o elemento original no array. Lembre-se de usar unset($value) após o loop para evitar efeitos colaterais indesejados, pois a última referência ainda apontaria para o último elemento do array.

3. Funções de Array

O PHP oferece uma vasta biblioteca de funções para manipular arrays de forma eficiente. Elas são otimizadas e muitas vezes mais concisas do que escrever loops foreach para cada operação.

Vamos explorar algumas das mais úteis para iteração e transformação.

3.1. array_walk(): Aplicando uma Função a Cada Elemento

A função array_walk() aplica uma função de retorno de chamada (callback) definida pelo usuário a cada elemento de um array. É útil para realizar uma ação em cada elemento sem necessariamente retornar um novo array.

array_walk(array &$array, callable $callback, mixed $userdata = null): bool
  • $array: O array de entrada. É passado por referência, então a função callback pode modificar os valores.
  • $callback: A função a ser aplicada a cada elemento. Ela recebe até 3 argumentos: o valor do elemento, a chave do elemento e (opcionalmente) dados de usuário.
  • $userdata: Um argumento opcional que será passado como o terceiro parâmetro para a função callback.

Exemplo Oficial da Documentação

<?php
$frutas = array("d" => "limão", "a" => "laranja", "b" => "banana", "c" => "maçã");
 
function test_print($item, $key)
{
    echo "$key. $item\n";
}
 
array_walk($frutas, 'test_print');
?>

Saída:

d. limão
a. laranja
b. banana
c. maçã

3.2. array_map(): Transformando Elementos em um Novo Array

A função array_map() aplica uma função de retorno de chamada a cada elemento dos arrays fornecidos, retornando um novo array contendo os resultados. É ideal para transformar os valores de um array.

array_map(?callable $callback, array $array, array ...$arrays): array
  • $callback: A função a ser aplicada a cada elemento. Pode ser null para combinar arrays.
  • $array: O array para processar.
  • ...$arrays: Arrays adicionais para processar.

Exemplo Oficial da Documentação (Adaptado)

<?php
function cubo($n)
{
    return ($n * $n * $n);
}
 
$numeros = [1, 2, 3, 4, 5];
$cubos = array_map('cubo', $numeros);
 
echo "Números originais: ";
print_r($numeros);
 
echo "Números ao cubo: ";
print_r($cubos);
 
// Usando função anônima (lambda) para maior concisão
$quadrados = array_map(function($n) {
    return $n * $n;
}, $numeros);
 
echo "Números ao quadrado: ";
print_r($quadrados);
?>

Saída:

Números originais: Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Números ao cubo: Array
(
    [0] => 1
    [1] => 8
    [2] => 27
    [3] => 64
    [4] => 125
)
Números ao quadrado: Array
(
    [0] => 1
    [1] => 4
    [2] => 9
    [3] => 16
    [4] => 25
)

3.3. array_filter(): Filtrando Elementos de um Array

A função array_filter() itera sobre cada valor no array, passando-o para a função callback. Se a função callback retornar true, o valor atual do array é incluído no array resultante.

array_filter(array $array, ?callable $callback = null, int $mode = 0): array
  • $array: O array para iterar.
  • $callback: A função de retorno de chamada. Se null, todos os elementos avaliados como false serão removidos.
  • $mode: Pode ser ARRAY_FILTER_USE_KEY (passa a chave para o callback), ARRAY_FILTER_USE_BOTH (passa chave e valor), ou o padrão (passa apenas o valor).

Exemplo Oficial da Documentação

<?php
function impar($var)
{
    // Retorna se o número é ímpar
    return ($var & 1);
}
 
function par($var)
{
    // Retorna se o número é par
    return (!($var & 1));
}
 
$array1 = array("a" => 1, "b" => 2, "c" => 3, "d" => 4, "e" => 5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);
 
echo "Array Original 1: ";
print_r($array1);
 
echo "Ímpares do Array 1:\n";
print_r(array_filter($array1, "impar"));
 
echo "Pares do Array 1:\n";
print_r(array_filter($array1, "par"));
 
echo "Array Original 2: ";
print_r($array2);
 
echo "Ímpares do Array 2:\n";
print_r(array_filter($array2, "impar"));
 
echo "Pares do Array 2:\n";
print_r(array_filter($array2, "par"));
 
// Filtrando valores "falsy" (0, false, null, string vazia, array vazio)
$valores_mistos = [0, 1, "hello", "", false, true, null, [], [1, 2]];
$valores_verdadeiros = array_filter($valores_mistos);
echo "Valores verdadeiros: ";
print_r($valores_verdadeiros);
?>

Saída:

Array Original 1: Array
(
    [a] => 1
    [b] => 2
    [c] => 3
    [d] => 4
    [e] => 5
)
Ímpares do Array 1:
Array
(
    [a] => 1
    [c] => 3
    [e] => 5
)
Pares do Array 1:
Array
(
    [b] => 2
    [d] => 4
)
Array Original 2: Array
(
    [0] => 6
    [1] => 7
    [2] => 8
    [3] => 9
    [4] => 10
    [5] => 11
    [6] => 12
)
Ímpares do Array 2:
Array
(
    [1] => 7
    [3] => 9
    [5] => 11
)
Pares do Array 2:
Array
(
    [0] => 6
    [2] => 8
    [4] => 10
    [6] => 12
)
Valores verdadeiros: Array
(
    [1] => 1
    [2] => hello
    [5] => true
    [8] => Array
        (
            [0] => 1
            [1] => 2
        )

)

3.4. array_reduce(): Reduzindo um Array a um Único Valor

A função array_reduce() aplica iterativamente uma função de retorno de chamada (callback) aos elementos do array para reduzi-lo a um único valor.

array_reduce(array $array, callable $callback, mixed $initial_value = null): mixed
  • $array: O array de entrada.
  • $callback: A função a ser aplicada. Ela recebe dois argumentos: o valor acumulado (carry) e o valor atual (item).
  • $initial_value: Um valor opcional para iniciar a redução. Se não fornecido, o primeiro elemento do array será usado como carry no primeiro passo, e item será o segundo elemento.

Exemplo Oficial da Documentação

<?php
function soma($carry, $item)
{
    $carry += $item;
    return $carry;
}
 
function produto($carry, $item)
{
    $carry *= $item;
    return $carry;
}
 
$a = array(1, 2, 3, 4, 5);
$x = array();
 
$soma_total = array_reduce($a, "soma");
$produto_total = array_reduce($a, "produto", 1); // Inicia com 1 para multiplicação
 
echo "Array original: ";
print_r($a);
 
echo "Soma total (usando array_reduce): " . $soma_total . "\n";
echo "Produto total (usando array_reduce): " . $produto_total . "\n";
 
// Exemplo com array vazio e valor inicial
$soma_vazio = array_reduce($x, "soma", "Nenhum valor");
echo "Soma de array vazio: " . $soma_vazio . "\n";
?>

Saída:

Array original: Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Soma total (usando array_reduce): 15
Produto total (usando array_reduce): 120
Soma de array vazio: Nenhum valor

3.5. Outras Funções Úteis (Breve Menção)

  • count(): Retorna o número de elementos em um array.
  • in_array(): Verifica se um valor existe em um array.
  • array_keys(): Retorna todas as chaves ou um subconjunto das chaves de um array.
  • array_values(): Retorna todos os valores de um array.
  • sort(), asort(), ksort(): Funções para ordenar arrays por valor ou chave.

4. Integração com Múltiplas Tecnologias (Contexto PHP)

O ponto 4 da sua requisição menciona "integração com múltiplas tecnologias (ex: Express + Better-Auth)". Para esta aula específica sobre iteração de arrays em PHP, a "integração" se dá no contexto de como essas ferramentas são usadas dentro de qualquer aplicação PHP.

Essas funções e o foreach são blocos de construção fundamentais. Você os usará seja em:

  • Um script PHP simples.
  • Um projeto com um framework (Laravel, Symfony, etc.).
  • Manipulando dados de um banco de dados.
  • Processando dados de requisições HTTP.
  • Gerando saídas HTML dinâmicas.

Eles são a base para lidar com coleções de dados, independentemente de onde esses dados venham ou para onde eles vão. Por exemplo, ao trabalhar com um framework como Laravel, você usará foreach para exibir uma lista de posts de um banco de dados, ou array_map para formatar uma coleção de objetos antes de enviá-los para uma API.

5. Exercícios/Desafios Práticos

É hora de praticar! Crie um novo arquivo PHP e resolva os desafios abaixo.

Desafio 1: Lista de Compras Simples

Você tem uma lista de compras com itens e suas quantidades.

Array de Entrada:

<?php
$lista_compras = [
    "Maçã" => 3,
    "Leite" => 1,
    "Pão" => 2,
    "Ovos" => 12,
    "Café" => 1
];
?>

Tarefas:

  • Usando foreach, exiba cada item da lista no formato: "Comprar X unidades de Y".
  • Calcule e exiba o número total de itens (unidades) na lista de compras.

Desafio 2: Filtrando Produtos por Preço

Você tem um catálogo de produtos com seus preços.

Array de Entrada:

<?php
$produtos = [
    ["nome" => "Notebook", "preco" => 3500, "categoria" => "Eletrônicos"],
    ["nome" => "Mouse", "preco" => 150, "categoria" => "Eletrônicos"],
    ["nome" => "Camiseta", "preco" => 80, "categoria" => "Vestuário"],
    ["nome" => "Teclado", "preco" => 250, "categoria" => "Eletrônicos"],
    ["nome" => "Calça Jeans", "preco" => 120, "categoria" => "Vestuário"],
    ["nome" => "Monitor", "preco" => 900, "categoria" => "Eletrônicos"]
];
?>

Tarefas:

  • Usando array_filter(), crie um novo array contendo apenas os produtos cujo preço é maior que R$ 200.
  • Usando array_filter() e ARRAY_FILTER_USE_BOTH, crie um array contendo apenas os produtos da categoria "Eletrônicos" com preço inferior a R$ 500.
  • Exiba os resultados de cada filtro de forma legível.

Desafio 3: Calculando o Valor Total do Carrinho

Você tem um carrinho de compras com produtos, quantidades e preços unitários.

Array de Entrada:

<?php
$carrinho = [
    ["item" => "Smartphone", "quantidade" => 1, "preco_unitario" => 1800],
    ["item" => "Fone de Ouvido", "quantidade" => 2, "preco_unitario" => 150],
    ["item" => "Carregador", "quantidade" => 1, "preco_unitario" => 80],
    ["item" => "Capa para Celular", "quantidade" => 3, "preco_unitario" => 30]
];
?>

Tarefas:

  • Usando array_map(), crie um novo array onde cada elemento seja o valor total de cada item (quantidade * preco_unitario).
  • Usando array_reduce(), calcule o valor total de todos os itens no carrinho (a soma dos totais individuais).
  • Exiba o valor total do carrinho de compras.

6. Resumo e Próximos Passos

Parabéns! 🎉 Você deu um grande passo para dominar a manipulação de arrays em PHP.

Nesta aula, você aprendeu:

  • Como usar o laço foreach para percorrer arrays, acessando apenas valores ou chaves e valores.
  • A importância de & para iterar por referência e como usá-lo com cautela.
  • O poder das funções de array:
    • array_walk() para aplicar uma função a cada elemento.
    • array_map() para transformar elementos e criar um novo array.
    • array_filter() para selecionar elementos com base em uma condição.
    • array_reduce() para agregar valores de um array em um único resultado.

Essas ferramentas são a espinha dorsal da manipulação de dados em PHP. Continue praticando e explorando a vasta documentação do PHP para descobrir ainda mais funções de array!

Próximos Passos:

  • Arrays Aninhados: Explore como iterar e manipular arrays dentro de arrays.
  • Funções de Ordenação: Aprenda sobre sort(), asort(), ksort(), usort() e outras funções para ordenar arrays.
  • Coleções (Frameworks): Se você começar a usar um framework como Laravel, explore as classes de Collection, que oferecem uma API fluente e poderosa baseada nesses mesmos princípios.

Até a próxima aula! Mantenha a prática e a curiosidade! ✨

© 2025 Escola All Dev. Todos os direitos reservados.