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
saudacaoque 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
usorte<=>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
- A função
saudacaorecebe$nomee$sobrenome(padrãonull). - Dentro dela,
$sobrenome = $sobrenome ?? '';garante que não seja nulo; se for, vira string vazia. - Montamos
$completoconcatenando o nome e, se houver sobrenome, um espaço e o sobrenome. Usamos operador ternário para evitar espaço extra. - Retornamos a string formatada com interpolação.
- No loop
foreach, extraímos o sobrenome com?? nulle chamamos a função, imprimindo cada saudação. - Depois, ordenamos
$usuarioscomusorte uma função que compara os nomes usando<=>. - 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
saudacaoquando não há sobrenome; mas o padrãonullresolve. - Usar
sortem vez deusortpara ordenar por chave específica;sortordenaria 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