PHP: Exemplos práticos – Agrupando uma lista de clientes por país e cidade(s)
Olá!
Neste post vamos aprender como agrupar uma lista de clientes por país e cidade(s). Em nosso contexto, teremos 3 tabelas, a tabela de país tblPais, a tabela de cidades tblCidades e a tabela de clientes tblClientes. Teremos uma função que fará o agrupamento e um arquivo de conexão com o banco de dados.
Tabelas
tbClientes(idCliente PK AI, nomeCliente VARCHAR(180), idPais INT(), idCidade INT()) tbPais(idPais PK AI, nomePais VARCHAR(180)) tbCidades(idCidade PK AI, nomeCidade VARCHAR(180), idPais INT()) |
O resultado esperado:
-------------------------------------------------------- País: Brasil - Cidade: Belo Horizonte -------------------------------------------------------- 9 - João 1 - Maria 10 - Roberto -------------------------------------------------------- País: Brasil - Cidade: Rio de Janeiro -------------------------------------------------------- 2 - Ana -------------------------------------------------------- País: Brasil - Cidade: São Paulo -------------------------------------------------------- 3 - Carlos -------------------------------------------------------- País: Itália - Cidade: Roma -------------------------------------------------------- 12 - André 13 - Gabriel 5 - Matheus ------------------------------------------ País: Portugal - Cidade: Porto ------------------------------------------ 11 - Carla 6 - Lucia |
Vamos ao código, sem frescura e direto ao ponto.
1º. Crie o arquivo conexao.php que fará a conexão com o banco de dados via MySQLi
<?php $con = new mysqli("nome_servidor", "usuario_do_banco", "senha_do_banco", "nome_do_banco"); ?> |
2º. Crie o arquivo funcoes.php que conterá a função de agrupamento.
<?php function agruparClientesPorPaisCidades($array) { $idPaisOld = 0; $idCidadeOld = 0; $html = ""; foreach ($array as $linha) { $idPaisNew = $linha['idPais']; $idCidadeNew = $linha['idCidade']; if ($idPaisNew != $idPaisOld) { $html .= "<hr>"; $html .= "País: {$linha['nomePais']} - Cidade: {$linha['nomeCidade']}"; $html .= "<hr>"; $html .= "<p>{$linha['idCliente']} - {$linha['nomeCliente']}</p>"; $idPaisOld = $idPaisNew; $idCidadeOld = $idCidadeNew; } else { if ($idCidadeNew != $idCidadeOld) { $html .= "<hr>"; $html .= "País: {$linha['nomePais']} - Cidade: {$linha['nomeCidade']}"; $html .= "<hr>"; $idCidadeOld = $idCidadeNew; } $html .= "<p>{$linha['idCliente']} - {$linha['nomeCliente']}</p>"; } } return $html; } |
3º. Crie o arquivo index.php que fará a requisição dos arquivos conexao.php e funcoes.php, além do select e exibição dos resultados.
<?php require_once "conexao.php"; require_once "funcoes.php"; $sql = "SELECT cl.*, p.nomePais, c.nomeCidade FROM tbClientes AS cl INNER JOIN tbPais AS p ON p.idPais = cl.idPais INNER JOIN tbCidades AS c ON c.idCidade = cl.idCidade ORDER BY nomePais, nomeCidade, nomeCliente ASC"; // atribuímos o resultado (array) para a variável $retorno $retorno = $con->query($sql)->fetch_all(MYSQLI_ASSOC); // passamos o array para a função e exibimos o resultado echo (agruparClientesPorPaisCidades($retorno)); |
Baixe o projeto completo clicando aqui.
Qualquer dúvida ou sugestão, deixe nos comentários.
Até +!