{"id":"5da4c266-68e8-4000-b129-4b22fee17b84","name":"PHP para iniciantes: aprenda praticando","description":"Aprenda PHP do zero com 12 desafios práticos em quatro módulos: entrada e saída, decisões, repetições, arrays e funções. Cada exercício apresenta uma tarefa, exemplos e testes automáticos. Use PHP no terminal: leia os dados de STDIN e imprima somente o resultado pedido, sem mensagens extras. Comece com números inteiros e avance até um resumo de notas. Não é necessário conhecer frameworks ou bancos de dados.","coverUrl":"/public/files/course-covers/5da4c266-68e8-4000-b129-4b22fee17b84/a3aada4e-c51e-4d8a-88e0-bb9046a61c07.webp","ownerNickname":"lucascode","activatedAt":"2026-10-27T03:25:04.487579","modules":[{"id":"03ebb5e7-edef-4fa3-9fb5-02ed7e4e79b8","title":"1. Primeiros passos: entrada e saída","description":"Crie programas PHP de terminal, leia dados e produza exatamente a saída solicitada.","position":1,"contents":[{"id":"b8cb54ed-60d7-44cd-bb16-76c5f7e16146","type":"YOUTUBE","title":"Primeiro programa em PHP — Curso em Vídeo","position":1,"description":"Aula de apoio de Gustavo Guanabara, do canal Curso em Vídeo.","availability":"AVAILABLE","youtube":{"videoId":"yK7bXIqLk9Q","url":"https://www.youtube.com/watch?v=yK7bXIqLk9Q","channelName":"Curso em Vídeo","madeForKids":false,"availability":"AVAILABLE","channelId":"UCrWvhVmt0Qac3HgsjQK62FQ","channel":{"handle":"@cursoemvideo","description":"💻 O Curso em Vídeo é um dos maiores canais educacionais do YouTube na área de programação! Criado pelo professor Gustavo Guanabara, oferece cursos gratuitos em formato de videoaulas para quem quer aprender tecnologia do zero.\n\n🎓 Para obter certificado, estude pela plataforma online, comprove seu conhecimento em entrevistas e complemente suas horas de estudo\n\n📘 Cursos de Algoritmo, PHP, Java, JavaScript, Python, HTML5, CSS3, Git e muito mais!\n\n🤝 Patrocínios, palestras e parcerias: envie um e-mail para comercial@cursoemvideo.com\n","avatarUrl":"https://yt3.ggpht.com/ytc/AIdro_m-8zZRJBWMwnaHcJgQv2IRr0dLcqCv1yKcQHgSEZ26jHw=s240-c-k-c0x00ffffff-no-rj","subscriberCount":2790000,"videoCount":1842}}},{"id":"bdc59369-e65a-4897-a404-4040df6efa69","type":"TEXT","title":"Do primeiro echo à leitura de dados","position":2,"availability":"AVAILABLE","text":{"body":"#### Objetivo\nAo terminar, você conseguirá escrever um programa que lê um nome e imprime uma saudação. Não é necessário conhecer outra linguagem. Faça as aulas na ordem e tente os desafios antes de consultar exemplos.\n\n#### Como o programa funciona\nPHP pode executar no servidor web ou no terminal. Os desafios desta trilha usam o terminal: entram linhas de texto pela entrada padrão e saem respostas pela saída padrão. Comece pelo editor da plataforma; para praticar localmente, use um arquivo .php e execute php arquivo.php em um computador com PHP instalado.\n\nUma instrução termina com ponto e vírgula. O código PHP começa com a tag de abertura. Em arquivos que contêm apenas PHP, a tag de fechamento pode ser omitida.\n\n```php\n<?php\necho \"Olá, mundo!\\n\";\n```\n\nO comando echo escreve texto. Aspas delimitam uma string. Dentro de aspas duplas, a sequência \\n representa uma quebra de linha. Um comentário iniciado por // explica o código e não é executado.\n\n#### Ler uma linha\n```php\n<?php\n$nome = trim(fgets(STDIN));\necho \"Bem-vindo, \" . $nome . \"!\\n\";\n```\n\nfgets(STDIN) lê uma linha, incluindo sua quebra de linha. trim remove espaços nas pontas e a quebra final. O ponto concatena textos. O cifrão inicia uma variável, que guarda um valor. Com a entrada Ana, o exemplo escreve Bem-vindo, Ana!.\n\n#### Saída exata\nNão escreva perguntas como Digite seu nome nos desafios automáticos, a menos que o enunciado peça. O avaliador espera somente a resposta. Letras, acentos, pontuação e espaços fazem parte do resultado.","published":true}},{"id":"49f0578f-651d-48be-914e-ade4d57135ce","type":"TEXT","title":"Prática guiada: ficha de apresentação","position":3,"availability":"AVAILABLE","text":{"body":"#### Tente primeiro\nLeia o nome de uma pessoa na primeira linha e sua cidade na segunda. Imprima uma única linha no formato Ana - Recife. Não coloque mensagens antes das leituras.\n\n#### Solução comentada\n```php\n<?php\n$nome = trim(fgets(STDIN));\n$cidade = trim(fgets(STDIN));\necho $nome . \" - \" . $cidade . \"\\n\";\n```\n\nA ordem das leituras deve corresponder à ordem da entrada. Cada chamada de fgets consome uma linha. Troque as entradas por nomes com espaços, como Ana Maria, para perceber que a leitura preserva o conteúdo interno da linha.\n\n#### Como corrigir problemas\nSe surgir erro de sintaxe, confira aspas, parênteses e ponto e vírgula. Se a saída estiver em duas linhas inesperadamente, confira se você aplicou trim ao valor lido. Leia a mensagem de erro e procure a linha indicada; às vezes o erro está na instrução anterior.","published":true}},{"id":"078deac1-b85f-4ddd-9378-1e65119d9a3a","type":"QUIZ","title":"Revisão — Primeiros passos: entrada e saída","position":4,"availability":"AVAILABLE","assessmentId":"ea9d63a8-0aa8-47c2-b3f4-d39f2d13c661"},{"id":"3b1aa58b-e7b6-4b2d-9fd8-6bbae2191b58","type":"QUIZ","title":"PHP na prática — Saudação personalizada","position":5,"description":"Programe em PHP e confira sua solução com testes de entrada e saída.","availability":"AVAILABLE","assessmentId":"f91c7ece-600a-4e3c-bb17-f292f9a6c605"},{"id":"f6dcfd12-a804-4e17-a4ee-66138b0a32e6","type":"QUIZ","title":"TESTE","position":6,"availability":"UNAVAILABLE","assessmentId":"f82b6db7-561c-4410-bf21-b61da2adcf1a"}]},{"id":"2a24f5e5-968d-4e91-ad89-2a5414fbbc47","title":"2. Variáveis, tipos e cálculos","description":"Converta entradas, calcule resultados e controle a apresentação de números.","position":2,"contents":[{"id":"e65822c3-a1e1-4571-95cb-539c3ae96953","type":"YOUTUBE","title":"Variáveis e constantes em PHP — Curso em Vídeo","position":1,"description":"Aula de apoio de Gustavo Guanabara, do canal Curso em Vídeo.","availability":"AVAILABLE","youtube":{"videoId":"eC42d9Rsz3g","url":"https://www.youtube.com/watch?v=eC42d9Rsz3g","channelName":"Curso em Vídeo","madeForKids":false,"availability":"AVAILABLE","channelId":"UCrWvhVmt0Qac3HgsjQK62FQ","channel":{"handle":"@cursoemvideo","description":"💻 O Curso em Vídeo é um dos maiores canais educacionais do YouTube na área de programação! Criado pelo professor Gustavo Guanabara, oferece cursos gratuitos em formato de videoaulas para quem quer aprender tecnologia do zero.\n\n🎓 Para obter certificado, estude pela plataforma online, comprove seu conhecimento em entrevistas e complemente suas horas de estudo\n\n📘 Cursos de Algoritmo, PHP, Java, JavaScript, Python, HTML5, CSS3, Git e muito mais!\n\n🤝 Patrocínios, palestras e parcerias: envie um e-mail para comercial@cursoemvideo.com\n","avatarUrl":"https://yt3.ggpht.com/ytc/AIdro_m-8zZRJBWMwnaHcJgQv2IRr0dLcqCv1yKcQHgSEZ26jHw=s240-c-k-c0x00ffffff-no-rj","subscriberCount":2790000,"videoCount":1842}}},{"id":"34ad6a77-bc51-4880-8a5f-8908f77a5723","type":"TEXT","title":"Transformando dados em resultados","position":2,"availability":"AVAILABLE","text":{"body":"#### Valores e tipos\nUma variável pode guardar texto, inteiro, número com casas decimais ou booleano. Exemplos: $nome = \"Lia\"; $idade = 20; $altura = 1.65; $ativo = true;. Nomes diferenciam maiúsculas de minúsculas: $preco e $Preco são variáveis distintas. Prefira nomes que expliquem o dado.\n\nfgets devolve texto. Converta uma entrada numérica antes de calcular: (int) para inteiro e (float) para decimal. Nesta trilha, números decimais de entrada usam ponto, como 12.50.\n\n```php\n<?php\n$quantidade = (int) trim(fgets(STDIN));\n$preco = (float) trim(fgets(STDIN));\n$total = $quantidade * $preco;\necho number_format($total, 2, \".\", \"\") . \"\\n\";\n```\n\n#### Operadores\nUse + para somar, - para subtrair, * para multiplicar e / para dividir. O operador % calcula o resto da divisão entre inteiros; 7 % 2 resulta em 1. Use parênteses para tornar a ordem clara: ($a + $b) / 2 calcula a média dos dois valores. A expressão $a + $b / 2 divide apenas $b antes de somar.\n\nO sinal = atribui um valor. Para acumular, $total += $valor equivale a $total = $total + $valor.\n\n#### Formatação\nnumber_format($valor, 2, \".\", \"\") produz uma string com duas casas decimais, ponto decimal e sem separador de milhar. Calcule com números e formate apenas a saída final. Para valores financeiros de aplicações reais, prefira representar centavos com inteiros; os exemplos com float aqui servem à aprendizagem e podem sofrer aproximações binárias.","published":true}},{"id":"31d76236-d69e-4290-9b12-ca0f56ef5a94","type":"TEXT","title":"Prática guiada: média e conversão de temperatura","position":3,"availability":"AVAILABLE","text":{"body":"#### Média aritmética\nLeia duas notas, uma por linha, e imprima sua média com uma casa decimal. Com 7 e 8, a resposta deve ser 7.5.\n\n```php\n<?php\n$a = (float) trim(fgets(STDIN));\n$b = (float) trim(fgets(STDIN));\n$media = ($a + $b) / 2;\necho number_format($media, 1, \".\", \"\") . \"\\n\";\n```\n\n#### Desafio para fazer localmente\nLeia uma temperatura Celsius e calcule Fahrenheit com F = C * 9 / 5 + 32. Mostre uma casa decimal. Confira os pares 0 → 32.0 e 100 → 212.0. Depois experimente -40 → -40.0.\n\n#### Checklist antes de enviar\nA conversão da entrada corresponde ao tipo do dado? Os parênteses representam a fórmula? A saída tem a quantidade exigida de casas decimais? O programa funciona para zero?","published":true}},{"id":"45986ad4-00bf-4b25-8e63-3e174c03aa9d","type":"QUIZ","title":"Revisão — Variáveis, tipos e cálculos","position":4,"availability":"AVAILABLE","assessmentId":"cd06313a-6ff5-4d10-a7c0-f1dffab8dcc8"},{"id":"eddf71ca-6f67-4185-8f83-86873a6d101d","type":"QUIZ","title":"PHP na prática — Total de uma compra","position":5,"availability":"AVAILABLE","assessmentId":"3327b858-7e31-4aff-af27-27290b255794"}]},{"id":"bbeb97fb-fae1-4b62-a690-7a8485c033e7","title":"3. Decisões com if, elseif e else","description":"Implemente regras e teste limites com operadores de comparação e condições lógicas.","position":3,"contents":[{"id":"640829fa-86f3-48fb-b910-ff2b3f1080ac","type":"YOUTUBE","title":"Estrutura condicional if — Curso em Vídeo","position":1,"description":"Aula de apoio de Gustavo Guanabara, do canal Curso em Vídeo.","availability":"AVAILABLE","youtube":{"videoId":"qAisUeI5oKE","url":"https://www.youtube.com/watch?v=qAisUeI5oKE","channelName":"Curso em Vídeo","madeForKids":false,"availability":"AVAILABLE","channelId":"UCrWvhVmt0Qac3HgsjQK62FQ","channel":{"handle":"@cursoemvideo","description":"💻 O Curso em Vídeo é um dos maiores canais educacionais do YouTube na área de programação! Criado pelo professor Gustavo Guanabara, oferece cursos gratuitos em formato de videoaulas para quem quer aprender tecnologia do zero.\n\n🎓 Para obter certificado, estude pela plataforma online, comprove seu conhecimento em entrevistas e complemente suas horas de estudo\n\n📘 Cursos de Algoritmo, PHP, Java, JavaScript, Python, HTML5, CSS3, Git e muito mais!\n\n🤝 Patrocínios, palestras e parcerias: envie um e-mail para comercial@cursoemvideo.com\n","avatarUrl":"https://yt3.ggpht.com/ytc/AIdro_m-8zZRJBWMwnaHcJgQv2IRr0dLcqCv1yKcQHgSEZ26jHw=s240-c-k-c0x00ffffff-no-rj","subscriberCount":2790000,"videoCount":1842}}},{"id":"4f63a53c-39ee-4036-abb1-578aeeaee85f","type":"TEXT","title":"Escolhendo o caminho do programa","position":2,"availability":"AVAILABLE","text":{"body":"#### Condições\nUma condição resulta em verdadeiro ou falso. Use >, <, >= e <= para comparar números. Use === para comparar valor e tipo e !== para identificar diferença de valor ou tipo. O operador == permite conversões de tipo; prefira comparações estritas quando os tipos já estiverem definidos. Não confunda =, que atribui, com operadores de comparação.\n\n```php\n<?php\n$idade = (int) trim(fgets(STDIN));\nif ($idade >= 18) {\n    echo \"Maior de idade\\n\";\n} else {\n    echo \"Menor de idade\\n\";\n}\n```\n\nO bloco if executa quando a condição é verdadeira. Caso contrário, executa o bloco else. As chaves delimitam cada bloco.\n\n#### Várias faixas\n```php\n<?php\n$pontos = (int) trim(fgets(STDIN));\nif ($pontos >= 80) {\n    echo \"Ouro\\n\";\n} elseif ($pontos >= 50) {\n    echo \"Prata\\n\";\n} else {\n    echo \"Bronze\\n\";\n}\n```\n\nSomente o primeiro bloco cuja condição é verdadeira executa. A ordem importa: testar primeiro >= 50 faria 90 cair em Prata. Os intervalos devem cobrir todos os valores previstos, sem deixar limites ambíguos.\n\n#### Combinar regras\nUse && quando duas condições precisam ser verdadeiras e || quando basta uma. Use ! para negar. Escreva parênteses ao combinar comparações. Por exemplo, ($idade >= 18 && $temDocumento) exige idade e documento ao mesmo tempo.\n\nA videoaula usa um ambiente antigo. Concentre-se na lógica de condições; siga os exemplos escritos desta trilha para entrada padrão e sintaxe dos desafios.","published":true}},{"id":"bc58c4ad-cdc3-4249-8466-fff0d059be55","type":"TEXT","title":"Prática guiada: paridade e limites","position":3,"availability":"AVAILABLE","text":{"body":"#### Par ou ímpar\nUm inteiro é par quando o resto da divisão por 2 é zero. Leia um inteiro e imprima PAR ou IMPAR.\n\n```php\n<?php\n$n = (int) trim(fgets(STDIN));\nif ($n % 2 === 0) {\n    echo \"PAR\\n\";\n} else {\n    echo \"IMPAR\\n\";\n}\n```\n\n#### Faça uma tabela de testes\nExperimente 0, 2, 7 e -4. Zero é par; números negativos também podem ser pares. Para testar ímpar, prefira resto diferente de zero, porque o resto de um inteiro negativo ímpar pode ser -1.\n\n#### Desafio para fazer localmente\nLeia uma nota de 0 a 10. Imprima APROVADO para nota >= 7, RECUPERACAO para nota >= 5 e menor que 7 e REPROVADO para as demais. Teste 4.9, 5, 6.9, 7 e 10. Considere apenas entradas válidas nesse desafio.","published":true}},{"id":"79a4d875-08ef-4e2c-a04e-96a558febd48","type":"QUIZ","title":"Revisão — Decisões com if, elseif e else","position":4,"availability":"AVAILABLE","assessmentId":"19f46a09-399d-4bd5-9cfa-3f461a4f7f8b"},{"id":"34bf9953-7a63-4f8b-90f2-6b68798397a0","type":"QUIZ","title":"PHP na prática — Classificação de nota","position":5,"availability":"AVAILABLE","assessmentId":"f27cc774-c7f6-4276-95ae-ba53f4d851e9"}]},{"id":"dfe42215-a577-4588-b4b9-e118a456cc16","title":"4. Repetições e acumuladores","description":"Use for e while para repetir cálculos sem copiar instruções.","position":4,"contents":[{"id":"cb07f7ac-7455-4d67-ac4f-0e05c7dc53f9","type":"YOUTUBE","title":"Estrutura de repetição for — Curso em Vídeo","position":1,"description":"Aula de apoio de Gustavo Guanabara, do canal Curso em Vídeo.","availability":"AVAILABLE","youtube":{"videoId":"ancrPpEq9Rw","url":"https://www.youtube.com/watch?v=ancrPpEq9Rw","channelName":"Curso em Vídeo","madeForKids":false,"availability":"AVAILABLE","channelId":"UCrWvhVmt0Qac3HgsjQK62FQ","channel":{"handle":"@cursoemvideo","description":"💻 O Curso em Vídeo é um dos maiores canais educacionais do YouTube na área de programação! Criado pelo professor Gustavo Guanabara, oferece cursos gratuitos em formato de videoaulas para quem quer aprender tecnologia do zero.\n\n🎓 Para obter certificado, estude pela plataforma online, comprove seu conhecimento em entrevistas e complemente suas horas de estudo\n\n📘 Cursos de Algoritmo, PHP, Java, JavaScript, Python, HTML5, CSS3, Git e muito mais!\n\n🤝 Patrocínios, palestras e parcerias: envie um e-mail para comercial@cursoemvideo.com\n","avatarUrl":"https://yt3.ggpht.com/ytc/AIdro_m-8zZRJBWMwnaHcJgQv2IRr0dLcqCv1yKcQHgSEZ26jHw=s240-c-k-c0x00ffffff-no-rj","subscriberCount":2790000,"videoCount":1842}}},{"id":"70321071-e768-4690-9973-c9390f2e3c13","type":"TEXT","title":"Contadores, somas e critérios de parada","position":2,"availability":"AVAILABLE","text":{"body":"#### Repetir com for\nUse for quando o número de repetições é conhecido. Seus três trechos são inicialização, condição de continuidade e atualização do contador.\n\n```php\n<?php\nfor ($i = 1; $i <= 4; $i++) {\n    echo $i . \"\\n\";\n}\n```\n\nEsse programa escreve 1, 2, 3 e 4 em linhas separadas. A condição é testada antes de cada execução. Trocar <= por < muda o último valor impresso.\n\n#### Acumular um resultado\n```php\n<?php\n$n = (int) trim(fgets(STDIN));\n$soma = 0;\nfor ($i = 0; $i < $n; $i++) {\n    $valor = (int) trim(fgets(STDIN));\n    $soma += $valor;\n}\necho $soma . \"\\n\";\n```\n\nA primeira linha informa quantos valores virão. O laço lê exatamente $n linhas. Inicialize a soma antes do laço; se você a zerar dentro dele, perderá os valores anteriores. Quando $n é zero, o corpo não executa e a soma permanece zero.\n\n#### Repetir com while\nwhile testa uma condição antes de executar o bloco. Garanta que alguma instrução altere a situação para o laço terminar.\n\n```php\n<?php\n$contador = 3;\nwhile ($contador > 0) {\n    echo $contador . \"\\n\";\n    $contador--;\n}\n```\n\nEsse exemplo escreve 3, 2 e 1. Não use laços sem critério de parada. O vídeo mostra lógica de repetição em uma versão antiga; nos exercícios, a saída é texto simples de terminal.","published":true}},{"id":"b23f6a9f-8747-4c4c-ac81-f131d50d3d37","type":"TEXT","title":"Prática guiada: tabuada e rastreamento","position":3,"availability":"AVAILABLE","text":{"body":"#### Tabuada\nLeia um inteiro e imprima os produtos por 1 até 10, um por linha.\n\n```php\n<?php\n$n = (int) trim(fgets(STDIN));\nfor ($i = 1; $i <= 10; $i++) {\n    echo ($n * $i) . \"\\n\";\n}\n```\n\nCom entrada 3, as três primeiras linhas são 3, 6 e 9; a última é 30. A saída pede somente os produtos, sem expressões como 3 x 1 = 3.\n\n#### Rastreie à mão\nPara somar 1 até 3, comece com soma = 0. Após adicionar 1, ela vale 1; após adicionar 2, vale 3; após adicionar 3, vale 6. Fazer essa tabela ajuda a separar o contador do acumulador.\n\n#### Desafio para fazer localmente\nLeia N, depois N inteiros, um por linha, e conte quantos são positivos. Zero não é positivo. Teste uma sequência só com negativos, outra com zero e outra mista. Para N = 0, imprima 0.","published":true}},{"id":"cf3ed31c-8d92-4250-8f3a-24242be6a4e6","type":"QUIZ","title":"Revisão — Repetições e acumuladores","position":4,"availability":"AVAILABLE","assessmentId":"fb23f0fc-0c1d-4f8d-aef9-94e5dcbf306e"},{"id":"20f5a6cb-7541-44fb-bf11-428500217d6a","type":"QUIZ","title":"PHP na prática — Contador de positivos","position":5,"availability":"AVAILABLE","assessmentId":"94c68a81-1373-4745-b2d1-65b6e217dffa"}]},{"id":"bc182664-1c85-4fa9-9081-e164b2247f5b","title":"5. Funções, arrays e projeto final","description":"Organize a lógica em funções e percorra coleções para construir um resumo de compras.","position":5,"contents":[{"id":"97b1e61e-b9be-4a9e-b6af-74e28a9811e3","type":"YOUTUBE","title":"Rotinas em PHP: funções e parâmetros — Curso em Vídeo","position":1,"description":"Aula de apoio de Gustavo Guanabara, do canal Curso em Vídeo.","availability":"AVAILABLE","youtube":{"videoId":"7V6MdZQFArc","url":"https://www.youtube.com/watch?v=7V6MdZQFArc","channelName":"Curso em Vídeo","madeForKids":false,"availability":"AVAILABLE","channelId":"UCrWvhVmt0Qac3HgsjQK62FQ","channel":{"handle":"@cursoemvideo","description":"💻 O Curso em Vídeo é um dos maiores canais educacionais do YouTube na área de programação! Criado pelo professor Gustavo Guanabara, oferece cursos gratuitos em formato de videoaulas para quem quer aprender tecnologia do zero.\n\n🎓 Para obter certificado, estude pela plataforma online, comprove seu conhecimento em entrevistas e complemente suas horas de estudo\n\n📘 Cursos de Algoritmo, PHP, Java, JavaScript, Python, HTML5, CSS3, Git e muito mais!\n\n🤝 Patrocínios, palestras e parcerias: envie um e-mail para comercial@cursoemvideo.com\n","avatarUrl":"https://yt3.ggpht.com/ytc/AIdro_m-8zZRJBWMwnaHcJgQv2IRr0dLcqCv1yKcQHgSEZ26jHw=s240-c-k-c0x00ffffff-no-rj","subscriberCount":2790000,"videoCount":1842}}},{"id":"57413860-f550-45cc-8709-f7626023f371","type":"TEXT","title":"Funções reutilizáveis e listas com arrays","position":2,"availability":"AVAILABLE","text":{"body":"#### Separar responsabilidades\nUma função recebe parâmetros e pode devolver um resultado com return. Isso facilita reutilizar cálculos e testar uma parte do programa. echo mostra algo ao usuário; return entrega um valor a quem chamou a função.\n\n```php\n<?php\nfunction dobro(int $numero): int {\n    return $numero * 2;\n}\n$valor = (int) trim(fgets(STDIN));\necho dobro($valor) . \"\\n\";\n```\n\n$numero existe dentro da função. O valor recebido não depende do nome da variável usada na chamada. As declarações int informam o tipo esperado no parâmetro e no retorno. O vídeo apresenta os fundamentos de funções; os exemplos desta aula usam sintaxe compatível com PHP 8.\n\n#### Listas\nUm array guarda vários valores. Em uma lista criada com [], os índices começam em zero. count informa a quantidade de elementos.\n\n```php\n<?php\n$precos = [10, 20, 5];\n$precos[] = 15;\n$total = 0;\nforeach ($precos as $preco) {\n    $total += $preco;\n}\necho count($precos) . \"\\n\";\necho $total . \"\\n\";\n```\n\nO programa imprime 4 e 50 em linhas separadas. foreach visita os elementos sem exigir que você controle os índices. Evite acessar uma posição que não existe.\n\n#### Arrays associativos\nChaves também podem ser textos: $produto = [\"nome\" => \"Caderno\", \"centavos\" => 1250];. Acesse $produto[\"centavos\"] para obter 1250. Uma lista de produtos pode conter vários arrays associativos.\n\n#### Testar funções\nTeste valores comuns, zero e limites das regras. Para uma lista vazia, um total começa em zero. Se calcular média, trate a lista vazia antes da divisão para evitar dividir por zero.","published":true}},{"id":"8595a123-1f7c-486c-a542-ceeb8f6118c2","type":"TEXT","title":"Projeto guiado: resumo de compras em centavos","position":3,"availability":"AVAILABLE","text":{"body":"#### Especificação\nLeia N na primeira linha. Depois leia N valores inteiros não negativos, um por linha, representando preços em centavos. Some os valores. Para subtotal de pelo menos 10000 centavos, conceda 10% de desconto; abaixo disso, desconto zero. Arredonde o desconto para baixo em centavos inteiros. Imprima subtotal, desconto e total, nessa ordem, um inteiro por linha. Para N = 0, imprima três zeros.\n\nExemplo: para N = 3 e preços 5000, 3000, 2500, as linhas de saída são 10500, 1050 e 9450.\n\n#### Estratégia\n1. Leia os preços e guarde-os em um array.\n2. Some em uma função, iniciando o acumulador em zero.\n3. Aplique a condição sobre o subtotal.\n4. Subtraia o desconto e imprima apenas os resultados.\n\n#### Implementação de referência\n```php\n<?php\nfunction somarPrecos(array $precos): int {\n    $total = 0;\n    foreach ($precos as $preco) {\n        $total += $preco;\n    }\n    return $total;\n}\n\n$n = (int) trim(fgets(STDIN));\n$precos = [];\nfor ($i = 0; $i < $n; $i++) {\n    $precos[] = (int) trim(fgets(STDIN));\n}\n$subtotal = somarPrecos($precos);\n$desconto = $subtotal >= 10000 ? intdiv($subtotal, 10) : 0;\n$total = $subtotal - $desconto;\necho $subtotal . \"\\n\" . $desconto . \"\\n\" . $total . \"\\n\";\n```\n\nO operador ternário escolhe entre dois valores: condição ? valorSeVerdadeiro : valorSeFalso. intdiv faz divisão inteira; para valores não negativos, descarta a parte fracionária. Assim, 10009 centavos geram desconto de 1000, conforme a regra do projeto.\n\n#### Conferência e próximos passos\nTeste subtotal 9999, 10000 e 10009, lista vazia e vários itens com valor zero. Depois explique por que a função retorna um valor em vez de imprimir o total. Ao concluir a trilha, você terá praticado entrada, saída, tipos, operações, decisões, repetições, funções e arrays. O próximo passo pode ser formulários e validação de entradas para aplicações web.","published":true}},{"id":"f271a8cf-9178-455b-98b4-9a06cbb212e3","type":"QUIZ","title":"Revisão — Funções, arrays e projeto final","position":4,"availability":"AVAILABLE","assessmentId":"24543b45-7ca8-4b4d-bcf2-cb5fd63177c7"},{"id":"bc93894f-d8b3-4f5b-b988-9c32460ddd39","type":"QUIZ","title":"PHP na prática — Projeto final: resumo de compras","position":5,"availability":"AVAILABLE","assessmentId":"7cca14a7-18f5-43e0-a654-82e0d9279cd4"}]}],"communityAvailable":true,"contributionsEnabled":true,"creator":{"id":"48d11b36-3820-4bd3-ae47-633ab005f3e4","nickname":"lucascode","linkedinUrl":null,"instagramUrl":null,"avatarUrl":null},"contributors":[],"contributorCount":0}