Médio PHP
Ordenação com spaceship e null coalescing
Enunciado
Crie um array de números: [3, 1, 4, 1, 5, 9, 2, 6]. Use a função usort com uma função de comparação que utilize o operador spaceship <=> para ordenar o array em ordem crescente. Depois, use ?? para definir um valor padrão para uma chave inexistente em um array associativo e imprima o resultado. Exiba o array ordenado com print_r.
Requisitos
- Definir o array de números e ordená-lo com
usortusando<=>. - Criar um array associativo sem a chave 'nome' e usar
??para obter 'Anônimo'. - Imprimir o array ordenado e o valor padrão.
Código inicial
<?php
$numeros = [3, 1, 4, 1, 5, 9, 2, 6];
// Ordene o array usando usort e spaceship
// Array associativo
$usuario = ['id' => 1];
// Use ?? para obter o nome
// Imprima os resultados
?>
Saída esperada
Array
(
[0] => 1
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 9
)
Nome: Anônimo
Ver dica
A função de comparação para usort deve retornar um inteiro. Use $a <=> $b para ordem crescente. Para o ??, lembre-se de que ele verifica se a chave existe e não é nula.
Mostrar solução
<?php
$numeros = [3, 1, 4, 1, 5, 9, 2, 6];
// Ordena usando spaceship
usort($numeros, function($a, $b) {
return $a <=> $b;
});
// Array associativo sem 'nome'
$usuario = ['id' => 1];
$nome = $usuario['nome'] ?? 'Anônimo';
echo "Nome: $nome\n";
print_r($numeros);
?>
Passo a passo
- Definimos o array
$numeroscom valores inteiros. usortrecebe o array e uma função anônima que compara dois elementos usando<=>. O spaceship retorna -1, 0 ou 1, que é exatamente o queusortespera.- O array é ordenado in-place (modificado diretamente).
- Criamos
$usuariosem a chave'nome'. - Usamos
??para atribuir'Anônimo'caso'nome'não exista ou sejanull. - Imprimimos o nome e depois o array ordenado com
print_r.
Por que funciona
O operador <=> simplifica a lógica de comparação, retornando um inteiro que indica a ordem. O ?? é seguro para acessar chaves inexistentes sem emitir avisos. Juntos, eles tornam o código conciso e idiomático.
Erros comuns
- Esquecer de retornar o resultado da comparação na função do
usort:return $a <=> $b;é necessário. - Usar
??em uma variável não definida sem o$:$nome = $usuario['nome'] ?? 'Anônimo';está correto, mas$nome = $usuario[nome] ?? 'Anônimo';causaria erro. - Ordenar com
sortem vez deusort(para arrays associativos,usortpreserva as chaves? Na verdade,usortreindexa; para preservar chaves, useuasort).
Outra forma de resolver
Poderia usar sort($numeros) para ordenação simples, mas usort com <=> é mais flexível para critérios personalizados.
Saída esperada
Nome: Anônimo
Array
(
[0] => 1
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 5
[6] => 6
[7] => 9
)