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 usort usando <=>.
  • 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

  1. Definimos o array $numeros com valores inteiros.
  2. usort recebe o array e uma função anônima que compara dois elementos usando <=>. O spaceship retorna -1, 0 ou 1, que é exatamente o que usort espera.
  3. O array é ordenado in-place (modificado diretamente).
  4. Criamos $usuario sem a chave 'nome'.
  5. Usamos ?? para atribuir 'Anônimo' caso 'nome' não exista ou seja null.
  6. 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 sort em vez de usort (para arrays associativos, usort preserva as chaves? Na verdade, usort reindexa; para preservar chaves, use uasort).

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
)