Desafio PHP

Sistema de saudação com operadores

Enunciado

Crie uma função saudacao($nome, $sobrenome = null) que retorne uma string de saudação. Se $sobrenome for null, use apenas o nome. Use o operador de concatenação . para montar a string. Depois, crie um array de usuários com chaves 'nome' e opcionalmente 'sobrenome'. Itere sobre o array e, para cada usuário, use ?? para obter o sobrenome (se não existir, passe null). Chame a função e imprima as saudações. Além disso, ordene os usuários pelo nome usando usort e <=> e imprima a lista ordenada.

Requisitos

  • Definir a função saudacao que usa ?? para tratar sobrenome nulo e concatenação para montar a mensagem.
  • Criar um array de pelo menos 3 usuários, alguns sem sobrenome.
  • Iterar, chamar a função e imprimir as saudações.
  • Ordenar os usuários por nome com usort e <=> e imprimir a lista ordenada.

Código inicial

<?php
// Defina a função saudacao

$usuarios = [
    ['nome' => 'Carlos', 'sobrenome' => 'Silva'],
    ['nome' => 'Ana'],
    ['nome' => 'Bruno', 'sobrenome' => 'Souza']
];

// Itere e imprima saudações

// Ordene por nome e imprima
?>

Saída esperada

Olá, Carlos Silva!
Olá, Ana!
Olá, Bruno Souza!
--- Ordenado ---
Ana
Bruno Souza
Carlos Silva
Ver dica

Na função, use $sobrenome ?? '' para evitar erro se for nulo. Para ordenar, compare os nomes com <=>. Lembre-se de que usort reindexa o array.

Mostrar solução
<?php
// Função que monta a saudação
function saudacao($nome, $sobrenome = null) {
    // Se sobrenome for null, usa string vazia
    $sobrenome = $sobrenome ?? '';
    // Concatena com espaço se sobrenome não for vazio
    $completo = $nome . ($sobrenome ? ' ' . $sobrenome : '');
    return "Olá, $completo!";
}

$usuarios = [
    ['nome' => 'Carlos', 'sobrenome' => 'Silva'],
    ['nome' => 'Ana'],
    ['nome' => 'Bruno', 'sobrenome' => 'Souza']
];

// Itera e imprime saudações
foreach ($usuarios as $u) {
    $sobrenome = $u['sobrenome'] ?? null;
    echo saudacao($u['nome'], $sobrenome) . "\n";
}

// Ordena por nome
usort($usuarios, function($a, $b) {
    return $a['nome'] <=> $b['nome'];
});

echo "--- Ordenado ---\n";
foreach ($usuarios as $u) {
    $sobrenome = $u['sobrenome'] ?? '';
    $completo = $u['nome'] . ($sobrenome ? ' ' . $sobrenome : '');
    echo $completo . "\n";
}
?>

Passo a passo

  1. A função saudacao recebe $nome e $sobrenome (padrão null).
  2. Dentro dela, $sobrenome = $sobrenome ?? ''; garante que não seja nulo; se for, vira string vazia.
  3. Montamos $completo concatenando o nome e, se houver sobrenome, um espaço e o sobrenome. Usamos operador ternário para evitar espaço extra.
  4. Retornamos a string formatada com interpolação.
  5. No loop foreach, extraímos o sobrenome com ?? null e chamamos a função, imprimindo cada saudação.
  6. Depois, ordenamos $usuarios com usort e uma função que compara os nomes usando <=>.
  7. Imprimimos a lista ordenada, novamente montando o nome completo com concatenação.

Por que funciona

O ?? trata a ausência da chave 'sobrenome' sem erros. A concatenação . junta as partes da string. O <=> fornece a lógica de comparação para ordenar. Tudo isso são operadores fundamentais do PHP.

Erros comuns

  • Dentro da função, usar $sobrenome ?? '' sem parênteses na concatenação pode causar precedência indesejada; por isso usamos ($sobrenome ? ' ' . $sobrenome : '').
  • Esquecer de passar o segundo argumento para saudacao quando não há sobrenome; mas o padrão null resolve.
  • Usar sort em vez de usort para ordenar por chave específica; sort ordenaria pelos valores, não pelo nome.

Outra forma de resolver

Poderia usar array_multisort com array_column, mas usort com <=> é mais legível e flexível.

Saída esperada

Olá, Carlos Silva!
Olá, Ana!
Olá, Bruno Souza!
--- Ordenado ---
Ana
Bruno Souza
Carlos Silva