Pular para o conteúdo
murad.guide

PHP

Capítulo 7

Uma lista de dados com arrays e foreach

5 min de leitura 985 palavras 1 gravura

Neste capítulo você vai organizar vários valores e mostrar cada um numa lista.

Seu ponto de partida

Estude depois do capítulo 06. O exemplo deste capítulo é 07-arrays-listas, no pacote que acompanha o volume. Copie a pasta inicio para um diretório de prática e preserve o original. A raiz do exemplo é a referência concluída desta etapa. Sua cópia permite experimentar sem perder a referência.

Execute o PHP na raiz da sua cópia com php -S 127.0.0.1:8000 -t public. Abra http://127.0.0.1:8000/. Não abra PHP por duplo clique nem use o servidor de Python. Encerre com Ctrl+C antes de trocar de etapa.

Como praticar

Leia a explicação e digite ou confira o código indicado. Mude uma coisa. Antes de conferir, anote sua previsão. Salve, recarregue e compare. Se não acontecer o esperado, investigue o erro antes de avançar. Cada experiência parte dos valores da referência. Depois de conferir, desfaça somente a mudança desse experimento antes de começar a próxima lição. Você pode parar depois de uma lição e retomar mais tarde.

Agrupe valores numa lista

Um array reúne vários valores. Nesta primeira lista, cada assunto ocupa uma posição numerada. A primeira posição é zero. Colchetes criam a lista e aspas delimitam cada texto.

O array assuntos ainda está escrito no arquivo. Ele serve como um ensaio para a futura lista de visitas. Antes de ler um arquivo do disco, vamos entender como tratar uma lista pequena que conseguimos conferir com os olhos.

Não escreva echo de um array esperando uma frase pronta. Echo serve para o valor de texto de uma posição. O percurso de todas as posições virá na próxima lição.

Faça no seu exemplo

No início de public/index.php, confira a lista e a saída de uma posição.

$assuntos = ["HTML", "CSS", "PHP"];
$primeiroAssunto = $assuntos[0];

Mude uma coisa e preveja

Troque somente o primeiro texto HTML por Estrutura.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

Recarregue. A linha Primeiro assunto deve mostrar Estrutura. Os outros valores continuam guardados no array.

Se não acontecer

Se a posição não existir, o PHP não adivinha um valor. Use zero para o primeiro item, um para o segundo e dois para o terceiro desta lista.

Percorra com foreach

Foreach repete um bloco para cada item do array. Em cada repetição, assunto recebe um valor diferente. Você escreve uma vez o HTML de um item da lista e o PHP o produz para todos os valores.

O ul identifica a lista no HTML; cada li representa um item. A repetição deve ficar dentro do ul e envolver o li. Fora do bloco, assunto não é uma lista nova, apenas o último valor usado.

Esta forma com dois-pontos e endforeach ajuda a misturar PHP e HTML. Ela tem a mesma finalidade de um bloco com chaves, mas não vamos misturar os dois estilos neste trecho.

Faça no seu exemplo

Em public/index.php, localize a seção Assuntos de estudo.

<ul>
<?php foreach ($assuntos as $assunto): ?>
  <li><?php echo $assunto; ?></li>
<?php endforeach; ?>
</ul>

Mude uma coisa e preveja

Acrescente “Revisão” ao final do array, depois de uma vírgula.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

Recarregue. A lista deve ganhar um quarto item sem você escrever outro li.

Se não acontecer

Se o PHP recusar o arquivo, confira vírgulas, aspas e colchete final. Se um assunto aparecer fora da lista, confira a posição do li e do endforeach.

Dê chaves aos campos de uma visita

Um array associativo usa nomes para identificar valores. Aqui nome e mensagem são chaves. A seta => liga cada chave ao seu valor. Colchetes com a chave recuperam aquele campo.

Uma visita precisa de mais de uma informação. Agrupar seus campos evita manter variáveis soltas sem saber a qual visita pertencem. Nesta etapa os textos são fictícios e fixos; a entrada do visitante será tratada depois.

A chave precisa ser escrita exatamente como foi criada. Nome não é nome. Uma mensagem recebida de fora exige preparo antes de entrar no HTML; chegaremos a isso antes do primeiro formulário.

Faça no seu exemplo

Confira a visita de demonstração no início e sua saída no article.

$visita = ["nome" => "Lia", "mensagem" => "Gostei da prática."];
// No HTML, $visita["nome"] recupera o nome dessa visita.

Mude uma coisa e preveja

Troque somente Gostei da prática. por Consegui conferir cada item.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

Recarregue. A visita demonstrativa deve mudar a mensagem e manter o nome. A lista de assuntos continua independente.

Se não acontecer

Se aparecer chave indefinida, confira mensagem na criação e no acesso. Não crie outra chave só para esconder um erro de digitação.

Trecho do resultado de referência do capítulo 07

A captura mostra um trecho da referência concluída. Abra e percorra o exemplo para conferir o restante. Experimentos temporários podem produzir outra aparência; restaure os valores indicados antes de comparar.

Atividades para fazer antes das respostas

Use uma nova cópia do exemplo. Tente aplicar o que aprendeu antes de consultar os comentários.

  1. Mostre o segundo assunto pelo índice.

  2. Acrescente um assunto e conte os itens no navegador.

  3. Altere o nome da visita, preservando a mensagem.

Respostas comentadas

Compare sua explicação e o que realmente aconteceu. Outra solução pode funcionar se cumprir o objetivo e preservar o acesso ao conteúdo.

  1. Use $assuntos[1]. O índice inicial é zero.

  2. Acrescente um texto separado por vírgula. Foreach deve produzir um li a mais.

  3. Mude somente o valor de $visita[“nome”] na criação do array.

Quando seguir

Você consegue distinguir lista, posição, chave e repetição. Se ainda precisa de ajuda, repita a experiência pequena antes de avançar.

Consulta opcional

Não é preciso ler os links externos para executar os arquivos fornecidos. Eles servem para consultar detalhes quando você quiser.

O arquivo completo

Referência do exemplo 07-arrays-listas, reproduzida aqui para que você possa conferir sem sair da página.

public/index.php

<?php
declare(strict_types=1);
$mensagem = "Uma visita por vez.";
$nome = "Lia";
$boasVindas = "Olá, " . $nome . ". Este é um exercício local.";
$assuntos = ["HTML", "CSS", "PHP"];
$primeiroAssunto = $assuntos[0];
$visita = ["nome" => "Lia", "mensagem" => "Gostei da prática."];
?>
<!doctype html>
<html lang="pt-BR">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>Livro de visitas de prática</title><link rel="stylesheet" href="estilos.css"></head>
<body><a class="pular" href="#conteudo">Pular para o conteúdo</a>
<header><p>Prática de PHP em pequenos passos</p><h1>Livro de visitas</h1>
<p>Conteúdo fictício. Somente neste computador.</p></header>
<main id="conteudo" tabindex="-1">
<p><?php echo $mensagem; ?></p>
<p><?php echo $boasVindas; ?></p>
<section aria-labelledby="assuntos"><h2 id="assuntos">Assuntos de estudo</h2>
<p>Primeiro assunto: <?php echo $primeiroAssunto; ?></p>
<ul><?php foreach ($assuntos as $assunto): ?><li><?php echo $assunto; ?></li><?php endforeach; ?></ul>
</section>
<article><h2>Visita demonstrativa</h2><h3><?= $visita["nome"] ?></h3><p><?= $visita["mensagem"] ?></p></article>

</main><footer><p>Servidor de estudo em 127.0.0.1. Encerre com Ctrl+C.</p></footer></body></html>

public/estilos.css

* { box-sizing: border-box; }
body { margin: 0; background: #f4f7fb; color: #203246;
  font: 1.05rem/1.65 Arial, sans-serif; }
header, main, footer { max-width: 48rem; margin-inline: auto; padding: 1.5rem; }
header { padding-top: 2.5rem; }
h1 { font-size: clamp(1.8rem, 5vw, 2.7rem); line-height: 1.2; }
main { background: #fff; border-radius: .8rem; }
article { border-top: 1px solid #cad4df; padding-block: 1rem; }
a { color: #124e77; text-underline-offset: .2em; }
nav { display: flex; flex-wrap: wrap; gap: 1rem; }
label { display: block; font-weight: bold; }
input:not([type=hidden]), textarea { width: 100%; max-width: 34rem;
  border: 2px solid #718095; border-radius: .35rem; padding: .7rem;
  font: inherit; color: inherit; background: #fff; }
button { font: inherit; background: #124e77; color: white;
  border: 0; border-radius: .35rem; padding: .75rem 1.2rem; cursor: pointer; }
button:hover { background: #103b59; }
.mensagem { white-space: pre-wrap; overflow-wrap: anywhere; }
.erros { color: #8b142c; }
.ok { color: #175c30; font-weight: bold; }
:focus-visible { outline: 3px solid #b04d00; outline-offset: 3px; }
.pular { position: absolute; left: -10000px; }
.pular:focus { position: static; display: block; padding: 1rem; background: white; }
@media (max-width: 35rem) { header,main,footer { padding: 1rem; } }