Usando PHP, qual é a maneira mais rápida de converter uma string como esta: "123"
para um número inteiro?
Por que esse método específico é o mais rápido? O que acontece se obtém entrada inesperada, como "hello"
ou uma matriz?
php
optimization
casting
nickf
fonte
fonte
(int)
eintval()
pode ser superior a 400%!Respostas:
Acabei de configurar um rápido exercício de benchmarking:
Em média, chamar intval () é duas vezes e meia mais lenta e a diferença é maior se sua entrada já for um número inteiro.
Eu estaria interessado em saber o porquê .
Atualização: Eu executei os testes novamente, desta vez com coerção
(0 + $var)
Adendo: acabei de me deparar com um comportamento ligeiramente inesperado, que você deve conhecer ao escolher um destes métodos:
Testado usando o PHP 5.3.1
fonte
+"15" == 15
(int)
eintval
, em cada par, fornece um%intval
, o caso base deve ser(int)
. Mas você tem um bom argumento de que teria ficado mais claro se ele tivesse dito isso explicitamente, especialmente desde que ele acrescentou mais tarde um terceiro caso!Pessoalmente, acho que o elenco é o mais bonito.
Se uma string como 'Hello' for enviada, ela será convertida em número inteiro 0. Para uma string como '22 anos ', será convertida em número inteiro 22. Qualquer coisa que não puder analisar um número se tornará 0.
Se você realmente PRECISA da velocidade, acho que as outras sugestões aqui estão corretas ao assumir que a coerção é a mais rápida.
fonte
Execute um teste.
Este foi um teste que executou cada cenário 10.000.000 de vezes. :-)
A cooperação é
0 + "123"
Fundição é
(integer)"123"
Eu acho que Co-ercion é um pouco mais rápido. Ah, e tentar
0 + array('123')
é um erro fatal no PHP. Você pode querer que seu código verifique o tipo do valor fornecido.Meu código de teste está abaixo.
fonte
settype
a este teste e o executei usando o PHP 7. O elenco saiu um pouco à frente e uma grande melhoria de desempenho em todos: string coerce: 1.9255340099335 string cast: 1.5142338275909 string settype: 4.149735212326 string fail coerce: 1.2346560955048 string fail cast: 1.3967711925507 string fail settype: 4.149735212326Você pode simplesmente converter uma string longa em um número inteiro usando FLOAT
$float = (float)$num;
Ou, se você quiser um número inteiro não flutuante, vá com
$float = (int)$num;
Por ex.
fonte
(int)
? Pode ser verdade que, se a cadeia de caracteres contiver um número inteiro, isso(float)
retornará um valor que funciona muito como um número inteiro (mesmo que seu tipo interno seja provavelmentefloat
), mas por que você faria isso, se a especificação retornasse um valor inteiro ? Suponha que a string recebida seja "1,3"? Você não receberá um número inteiro. Além disso, para quem lê o código no futuro, você deve dizer o que quer dizer. Se você quer dizer "deve ser um número inteiro", diga(int)
não(float)
.fonte
excrato inteiro de qualquer string
$ in = 'tel.123-12-33';
// $ out = '1231233';
fonte
Mais resultados de benchmark ad-hoc:
fonte
{ $i = +"-11"; $i = +"-11"; $i= +"-11"; $i= +"-11"; ... }
. Também é arriscado usar o valor literal"-11"
diretamente, a menos que você tenha certeza de que o idioma não fará parte do trabalho em tempo de compilação. Provavelmente está bem para uma linguagem dinâmica como PHP, mas mencionei para referência futura se estiver testando fórmulas em outras linguagens. Mais seguro definir uma variável$x = "-11"
antes do loop de teste e usá-la. De modo que o código interno é$i =+$x
.Executou um benchmark e a maneira mais rápida de obter um número inteiro real (usando todos os métodos disponíveis) é
Apenas usando
retorna um flutuador.
fonte
(int)"12.345"
? Mais rápido em que porcentagem?