O Truque do map(‘intVal’) no Laravel: Porque é Que o Teu Collection Não Faz o Que Pensas

8 0

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!

(Visited 1 times, 1 visits today)

Elisio Leonardo

Elisio Leonardo is an experienced Web Developer, Solutions Architect, Digital Marketing Expert, and content producer with a passion for technology, artificial intelligence, web development, and entertainment. With nearly 15 years of writing engaging content on technology and entertainment, particularly Comic Book Movies, Elisio has become a trusted source of information in the digital landscape.