This post is also available in:
English
Há pequenas dicas que nos poupam horas de trabalho e frustração. Esta é uma delas, e surgiu de uma publicação do @jordankdalton no X. À primeira vista parece código inofensivo, mas o resultado vai surpreender-te. Vamos lá perceber.
O Código Que Parece Certo (Mas Não É)
Imagina que tens uma colecção de números guardados como texto e queres convertê-los para inteiros. A forma mais directa seria passar o nome da função directamente ao map:
collect(["1", "2", "3", "4"])->map('intVal');
O que esperas? Provavelmente [1, 2, 3, 4]. Mas o que recebes é isto:
[1, 0, 0, 0]
Estranho, não é? O primeiro elemento está correcto, mas todos os outros transformam-se em zero. Então onde é que isto falha?
Porque é Que Isto Acontece
O segredo está na forma como o map das Collections chama o teu callback. Ao contrário do que muita gente pensa, ele não passa apenas o valor — passa dois argumentos: o valor e a chave do elemento. Ou seja, internamente o Laravel acaba por fazer algo como:
intval("1", 0); // chave 0
intval("2", 1); // chave 1
intval("3", 2); // chave 2
intval("4", 3); // chave 3
E é aqui que está a armadilha: o segundo parâmetro do intval() é a base numérica (o radix). Vejamos o que acontece:
intval("1", 0)→ a base 0 significa “detectar automaticamente” → devolve 1.intval("2", 1)→ a base 1 é inválida → devolve 0.intval("3", 2)→ em base 2 (binário), o “3” não existe → devolve 0.intval("4", 3)→ em base 3, o “4” não existe → devolve 0.
Mistério resolvido: a chave foi parar ao lugar errado.
A Forma Correcta de o Fazer
A solução é simples: envolve a chamada numa arrow function, para controlares exactamente qual o argumento que é passado:
collect(["1", "2", "3", "4"])->map(fn($value) => intVal($value)); // [1, 2, 3, 4] — winner!
Desta forma, a chave é ignorada e o intval() recebe apenas o valor, usando a base 10 por predefinição. O resultado sai correcto.
A Lição a Reter
Tem cuidado ao passar o nome de uma função como string directamente ao map — sobretudo se essa função tiver parâmetros opcionais. Funções como intval(), round() ou number_format() podem receber a chave como segundo argumento e devolver-te resultados inesperados. Na dúvida, usa sempre uma arrow function ou uma closure: manténs o controlo total e o teu código fica mais legível. Um pormenor pequeno, mas que faz toda a diferença. 🚀
Já tinhas caído nesta armadilha? Conta-nos nos comentários!








Comentários Recentes