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é +!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *